]> granicus.if.org Git - clang/commitdiff
Mark the ExtWarn for in-class initialization of static const float members as a GNU...
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 29 Sep 2011 23:18:34 +0000 (23:18 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 29 Sep 2011 23:18:34 +0000 (23:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140820 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp
test/CXX/class/class.static/class.static.data/p3.cpp
test/FixIt/fixit-cxx0x.cpp
test/SemaCXX/class.cpp
test/SemaCXX/cxx0x-class.cpp
test/SemaTemplate/instantiate-static-var.cpp

index 37b33eb0fe1fa32ee17af6fc751654b943071772..52b288f49cc14622f41d22564950fbea6f2f0597 100644 (file)
@@ -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<DiagGroup<"static-member-init">>;
-def ext_in_class_initializer_literal_type : ExtWarn<
+  "in-class initializer for static data member of type %0 is a GNU extension">,
+  InGroup<GNU>;
+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<DiagGroup<"static-member-init">>;
+  "'constexpr' specifier">;
 def err_in_class_initializer_non_constant : Error<
   "in-class initializer is not a constant expression">;
 
index d34d710cc77a7e6077c8687256415e9e64c467a4..7bb3aa15110258f2548c14f0d6391f32f560ea6d 100644 (file)
@@ -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();
index 72dbec771ae1ca539ea7a1a02dcb8aa29040f1bf..51b93a2e8f953023206451f04c149f4167deed4d 100644 (file)
@@ -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}}
 };
 
index 2addad4696ea0b9b1cf96a0458cfaab912fa8ffb..8c404b66119853dea44539eac11ebb5f75349b42 100644 (file)
@@ -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;
   };
 }
index 725e93f40c66028d62c4580d04e2f671159c262e..8d1257895fbee1791606136923c4f4a4f6aa6786 100644 (file)
@@ -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}}
   };
 }
 
index 4c23932a719fba4de98245e6e92339eb7430e9f1..bd857e07febed053748f7b06934979b93a2e4837 100644 (file)
@@ -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}}
   };
index 723cbd388f673e0cccd048dec01749a515825a2c..d2b0459ccc5810c37c11ed6c31bb6b92dfcb9d68 100644 (file)
@@ -11,7 +11,7 @@ X<int, 0> xi0; // expected-note{{in instantiation of template class 'X<int, 0>'
 
 template<typename T>
 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<float> fy; // expected-note{{in instantiation of template class 'Y<float>' requested here}}