summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td2
-rw-r--r--clang/lib/Sema/SemaDecl.cpp15
-rw-r--r--clang/test/CXX/class/class.static/class.static.data/p3.cpp4
3 files changed, 9 insertions, 12 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 5f36f18656c..fc8c636bb3f 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -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<
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1974f30b8e5..718a19b9880 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -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;
}
diff --git a/clang/test/CXX/class/class.static/class.static.data/p3.cpp b/clang/test/CXX/class/class.static/class.static.data/p3.cpp
index 031c3766488..82460c5d962 100644
--- a/clang/test/CXX/class/class.static/class.static.data/p3.cpp
+++ b/clang/test/CXX/class/class.static/class.static.data/p3.cpp
@@ -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;
OpenPOWER on IntegriCloud