diff options
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 1 | ||||
| -rw-r--r-- | clang/test/CXX/class/class.static/class.static.data/p3.cpp | 14 | 
2 files changed, 15 insertions, 0 deletions
| diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index c07ae75cb2c..ef8f366aada 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -330,6 +330,7 @@ Decl *TemplateDeclInstantiator::VisitVarDecl(VarDecl *D) {    Var->setThreadSpecified(D->isThreadSpecified());    Var->setCXXDirectInitializer(D->hasCXXDirectInitializer());    Var->setCXXForRangeDecl(D->isCXXForRangeDecl()); +  Var->setConstexpr(D->isConstexpr());    // Substitute the nested name specifier, if any.    if (SubstQualifier(D, Var)) 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 77870f42559..4d5ac470a0c 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 @@ -24,3 +24,17 @@ constexpr int S::b = 0;  const int S::c;  constexpr int S::d = 0;  constexpr int S::d2; + +template<typename T> +struct U { +  static constexpr int a = 0; +  static constexpr int b; // expected-error {{declaration of constexpr static data member 'b' requires an initializer}} +  // FIXME: It'd be nice to error on this at template definition time. +  static constexpr NonLit h = NonLit(); // expected-error 2{{must be initialized by a constant expression}} expected-note 2{{non-literal type}} +  static constexpr T c = T(); // expected-error {{must be initialized by a constant expression}} expected-note {{non-literal type}} +}; + +U<int> u1; // expected-note {{here}} +U<NonLit> u2; // expected-note {{here}} + +static_assert(U<int>::a == 0, ""); | 

