From 947be1941e9a1d4233116f51a45799d3904d4231 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Thu, 29 Sep 2011 23:18:34 +0000 Subject: [PATCH] Mark the ExtWarn for in-class initialization of static const float members as a GNU extension. Don't extend the scope of this extension to all literal types in C++0x mode. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140820 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/DiagnosticSemaKinds.td | 9 ++++----- lib/Sema/SemaDecl.cpp | 15 ++++++++------- .../class/class.static/class.static.data/p3.cpp | 4 ++-- test/FixIt/fixit-cxx0x.cpp | 6 ++---- test/SemaCXX/class.cpp | 4 ++-- test/SemaCXX/cxx0x-class.cpp | 4 ++-- test/SemaTemplate/instantiate-static-var.cpp | 2 +- 7 files changed, 21 insertions(+), 23 deletions(-) diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 37b33eb0fe..52b288f49c 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -4082,12 +4082,11 @@ def err_in_class_initializer_volatile : Error< def err_in_class_initializer_bad_type : Error< "static data member of type %0 must be initialized out of line">; def ext_in_class_initializer_float_type : ExtWarn< - "in-class initializer for static data member of type %0 not allowed, " - "accepted as an extension">, InGroup>; -def ext_in_class_initializer_literal_type : ExtWarn< + "in-class initializer for static data member of type %0 is a GNU extension">, + InGroup; +def err_in_class_initializer_literal_type : Error< "in-class initializer for static data member of type %0 requires " - "'constexpr' specifier, accepted as an extension">, - InGroup>; + "'constexpr' specifier">; def err_in_class_initializer_non_constant : Error< "in-class initializer is not a constant expression">; diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index d34d710cc7..7bb3aa1511 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -5875,13 +5875,6 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, VDecl->setInvalidDecl(); } - // Suggest adding 'constexpr' in C++0x for literal types. - } else if (getLangOptions().CPlusPlus0x && T->isLiteralType()) { - Diag(VDecl->getLocation(), diag::ext_in_class_initializer_literal_type) - << T << Init->getSourceRange() - << FixItHint::CreateInsertion(VDecl->getLocStart(), "constexpr "); - VDecl->setConstexpr(true); - // We allow floating-point constants as an extension. } else if (T->isFloatingType()) { // also permits complex, which is ok Diag(VDecl->getLocation(), diag::ext_in_class_initializer_float_type) @@ -5893,6 +5886,14 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, << Init->getSourceRange(); VDecl->setInvalidDecl(); } + + // Suggest adding 'constexpr' in C++0x for literal types. + } else if (getLangOptions().CPlusPlus0x && T->isLiteralType()) { + Diag(VDecl->getLocation(), diag::err_in_class_initializer_literal_type) + << T << Init->getSourceRange() + << FixItHint::CreateInsertion(VDecl->getLocStart(), "constexpr "); + VDecl->setConstexpr(true); + } else { Diag(VDecl->getLocation(), diag::err_in_class_initializer_bad_type) << T << Init->getSourceRange(); diff --git a/test/CXX/class/class.static/class.static.data/p3.cpp b/test/CXX/class/class.static/class.static.data/p3.cpp index 72dbec771a..51b93a2e8f 100644 --- a/test/CXX/class/class.static/class.static.data/p3.cpp +++ b/test/CXX/class/class.static/class.static.data/p3.cpp @@ -12,8 +12,8 @@ struct S { static const int d; static constexpr double e = 0.0; // ok - static const double f = 0.0; // expected-warning {{accepted as an extension}} - static char *const g = 0; // expected-warning {{accepted as an extension}} + static const double f = 0.0; // expected-warning {{extension}} + static char *const g = 0; // expected-error {{requires 'constexpr' specifier}} static const NonLit h = NonLit(); // expected-error {{must be initialized out of line}} }; diff --git a/test/FixIt/fixit-cxx0x.cpp b/test/FixIt/fixit-cxx0x.cpp index 2addad4696..8c404b6611 100644 --- a/test/FixIt/fixit-cxx0x.cpp +++ b/test/FixIt/fixit-cxx0x.cpp @@ -1,6 +1,6 @@ // RUN: %clang_cc1 -verify -std=c++0x %s // RUN: cp %s %t -// RUN: not %clang_cc1 -x c++ -std=c++0x -Werror -fixit %t +// RUN: not %clang_cc1 -x c++ -std=c++0x -fixit %t // RUN: %clang_cc1 -Wall -pedantic -x c++ -std=c++0x %t /* This is a test of the various code modification hints that only @@ -53,9 +53,7 @@ namespace Constexpr { #endif struct S { - static const double d = 0.0; // expected-warning {{accepted as an extension}} - // -> constexpr static const double d = 0.0; - static char *const p = 0; // expected-warning {{accepted as an extension}} + static char *const p = 0; // expected-error {{requires 'constexpr' specifier}} // -> constexpr static char *const p = 0; }; } diff --git a/test/SemaCXX/class.cpp b/test/SemaCXX/class.cpp index 725e93f40c..8d1257895f 100644 --- a/test/SemaCXX/class.cpp +++ b/test/SemaCXX/class.cpp @@ -173,8 +173,8 @@ namespace rdar8367341 { float foo(); struct A { - static const float x = 5.0f; // expected-warning {{in-class initializer for static data member of type 'const float' not allowed}} - static const float y = foo(); // expected-warning {{in-class initializer for static data member of type 'const float' not allowed}} expected-error {{in-class initializer is not a constant expression}} + static const float x = 5.0f; // expected-warning {{in-class initializer for static data member of type 'const float' is a GNU extension}} + static const float y = foo(); // expected-warning {{in-class initializer for static data member of type 'const float' is a GNU extension}} expected-error {{in-class initializer is not a constant expression}} }; } diff --git a/test/SemaCXX/cxx0x-class.cpp b/test/SemaCXX/cxx0x-class.cpp index 4c23932a71..bd857e07fe 100644 --- a/test/SemaCXX/cxx0x-class.cpp +++ b/test/SemaCXX/cxx0x-class.cpp @@ -20,8 +20,8 @@ namespace rdar8367341 { float foo(); struct A { - static const float x = 5.0f; // expected-warning {{requires 'constexpr' specifier}} - static const float y = foo(); // expected-warning {{requires 'constexpr' specifier}} expected-error {{must be initialized by a constant expression}} + static const float x = 5.0f; // expected-warning {{GNU extension}} + static const float y = foo(); // expected-warning {{GNU extension}} expected-error {{in-class initializer is not a constant expression}} static constexpr float x2 = 5.0f; static constexpr float y2 = foo(); // expected-error {{must be initialized by a constant expression}} }; diff --git a/test/SemaTemplate/instantiate-static-var.cpp b/test/SemaTemplate/instantiate-static-var.cpp index 723cbd388f..d2b0459ccc 100644 --- a/test/SemaTemplate/instantiate-static-var.cpp +++ b/test/SemaTemplate/instantiate-static-var.cpp @@ -11,7 +11,7 @@ X xi0; // expected-note{{in instantiation of template class 'X' template class Y { - static const T value = 0; // expected-warning{{in-class initializer for static data member of type 'const float' not allowed, accepted as an extension}} + static const T value = 0; // expected-warning{{in-class initializer for static data member of type 'const float' is a GNU extension}} }; Y fy; // expected-note{{in instantiation of template class 'Y' requested here}} -- 2.40.0