From: Richard Smith Date: Mon, 10 Oct 2011 16:38:04 +0000 (+0000) Subject: constexpr: Disable checking of constructor member initializer lists for X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6e4337556efa700d5b4dceac22fa0dfbd1cdee8f;p=clang constexpr: Disable checking of constructor member initializer lists for constexpr constructor templates. Such checking is optional, and currently hard to get right since clang doesn't generate implicit member initializers until instantiation (even for non-dependent members). This is needed for clang to accept libstdc++ from g++4.6 in c++0x mode. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@141547 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 247d8dc5bb..4f9c0493c6 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -902,7 +902,8 @@ bool Sema::CheckConstexprFunctionBody(const FunctionDecl *Dcl, Stmt *Body) { Diag(Dcl->getLocation(), diag::err_constexpr_union_ctor_no_init); return false; } - } else if (!Constructor->isDelegatingConstructor()) { + } else if (!Constructor->isDependentContext() && + !Constructor->isDelegatingConstructor()) { assert(RD->getNumVBases() == 0 && "constexpr ctor with virtual bases"); // Skip detailed checking if we have enough initializers, and we would diff --git a/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp b/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp index 4594f6cdb0..804ea9abdd 100644 --- a/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp +++ b/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp @@ -150,6 +150,44 @@ struct AnonMembers { constexpr AnonMembers(int(&)[6]) {} // expected-error {{constexpr constructor must initialize all members}} }; +template using Int = int; +template +struct TemplateInit { + T a; + int b; // desired-note {{not initialized}} + Int c; // desired-note {{not initialized}} + struct { + T d; + int e; // desired-note {{not initialized}} + Int f; // desired-note {{not initialized}} + }; + struct { + Literal l; + Literal m; + Literal n[3]; + }; + union { // desired-note {{not initialized}} + T g; + T h; + }; + // FIXME: This is ill-formed (no diagnostic required). We should diagnose it. + constexpr TemplateInit() {} // desired-error {{must initialize all members}} +}; +template struct TemplateInit2 { + Literal l; + constexpr TemplateInit2() {} // ok +}; + +template struct weak_ptr { + constexpr weak_ptr() : p(0) {} + T *p; +}; +template struct enable_shared_from_this { + weak_ptr weak_this; + constexpr enable_shared_from_this() {} // ok +}; +constexpr int f(enable_shared_from_this); + // - every constructor involved in initializing non-static data members and base // class sub-objects shall be a constexpr constructor. //