]> granicus.if.org Git - clang/commitdiff
constexpr: Disable checking of constructor member initializer lists for
authorRichard Smith <richard-llvm@metafoo.co.uk>
Mon, 10 Oct 2011 16:38:04 +0000 (16:38 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Mon, 10 Oct 2011 16:38:04 +0000 (16:38 +0000)
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

lib/Sema/SemaDeclCXX.cpp
test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp

index 247d8dc5bba82cf0b215c9a08b129cdff5dad1c6..4f9c0493c674890e8c9c32e883aff377b1d12344 100644 (file)
@@ -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
index 4594f6cdb063e4730eb47d6fbece8e89274a4aaa..804ea9abddcf6b9e1cece0604c19f21c726394cd 100644 (file)
@@ -150,6 +150,44 @@ struct AnonMembers {
   constexpr AnonMembers(int(&)[6]) {} // expected-error {{constexpr constructor must initialize all members}}
 };
 
+template<typename T> using Int = int;
+template<typename T>
+struct TemplateInit {
+  T a;
+  int b; // desired-note {{not initialized}}
+  Int<T> c; // desired-note {{not initialized}}
+  struct {
+    T d;
+    int e; // desired-note {{not initialized}}
+    Int<T> 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<typename T> struct TemplateInit2 {
+  Literal l;
+  constexpr TemplateInit2() {} // ok
+};
+
+template<typename T> struct weak_ptr {
+  constexpr weak_ptr() : p(0) {}
+  T *p;
+};
+template<typename T> struct enable_shared_from_this {
+  weak_ptr<T> weak_this;
+  constexpr enable_shared_from_this() {} // ok
+};
+constexpr int f(enable_shared_from_this<int>);
+
 // - every constructor involved in initializing non-static data members and base
 //   class sub-objects shall be a constexpr constructor.
 //