]> granicus.if.org Git - clang/commitdiff
PR11067: A definition of a constexpr static variable doesn't need an initializer...
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 6 Oct 2011 09:21:12 +0000 (09:21 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 6 Oct 2011 09:21:12 +0000 (09:21 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@141279 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp
test/CXX/class/class.static/class.static.data/p3.cpp

index 5f36f18656cdb6a90dcedac70102f42a60fc2016..fc8c636bb3f4842e2f4bd3eb50e695984f01060f 100644 (file)
@@ -1192,8 +1192,6 @@ def err_invalid_constexpr_var_decl : Error<
   "constexpr variable declaration must be a definition">;
 def err_constexpr_var_requires_init : Error<
   "declaration of constexpr variable %0 requires an initializer">;
-def err_constexpr_initialized_static_member : Error<
-  "definition of initialized static data member %0 cannot be marked constexpr">;
 def err_constexpr_var_requires_const_init : Error<
   "constexpr variable %0 must be initialized by a constant expression">;
 def err_constexpr_redecl_mismatch : Error<
index 1974f30b8e554b8935a76eb5dcad0f0b6a86440e..718a19b9880264ee186dc2283d436f72dfb3881c 100644 (file)
@@ -6032,15 +6032,12 @@ void Sema::ActOnUninitializedDecl(Decl *RealDecl,
     // C++0x [class.static.data]p3: A static data member can be declared with
     // the constexpr specifier; if so, its declaration shall specify
     // a brace-or-equal-initializer.
-    if (Var->isConstexpr()) {
-      // FIXME: Provide fix-its to convert the constexpr to const.
-      if (Var->isStaticDataMember() && Var->getAnyInitializer()) {
-        Diag(Var->getLocation(), diag::err_constexpr_initialized_static_member)
-          << Var->getDeclName();
-      } else {
-        Diag(Var->getLocation(), diag::err_constexpr_var_requires_init)
-          << Var->getDeclName();
-      }
+    //
+    // A static data member's definition may inherit an initializer from an
+    // in-class declaration.
+    if (Var->isConstexpr() && !Var->getAnyInitializer()) {
+      Diag(Var->getLocation(), diag::err_constexpr_var_requires_init)
+        << Var->getDeclName();
       Var->setInvalidDecl();
       return;
     }
index 031c37664882c6a5e6dafde78a6e4e05532f9557..82460c5d96208d4f15328dc2f3eeb0c9508771e6 100644 (file)
@@ -10,6 +10,7 @@ struct S {
 
   static constexpr int c = 0;
   static const int d;
+  static const int d2 = 0;
 
   static constexpr double e = 0.0; // ok
   static const double f = 0.0; // expected-warning {{extension}} expected-note {{use 'constexpr' specifier}}
@@ -17,8 +18,9 @@ struct S {
   static const NonLit h = NonLit(); // expected-error {{must be initialized out of line}}
 };
 
-constexpr int S::a; // expected-error {{definition of initialized static data member 'a' cannot be marked constexpr}}
+constexpr int S::a;
 constexpr int S::b = 0;
 
 const int S::c;
 constexpr int S::d = 0;
+constexpr int S::d2;