]> granicus.if.org Git - clang/commitdiff
As we do with base and member initializers in a dependent class, delay
authorDouglas Gregor <dgregor@apple.com>
Fri, 14 Sep 2012 04:20:37 +0000 (04:20 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 14 Sep 2012 04:20:37 +0000 (04:20 +0000)
type checking for non-static data member initializers in a dependent
class, because our ASTs lose too much information to when
type-checking an initializer. Fixes <rdar://problem/11974632>,
although the result is still rather unsatisfactory.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163871 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
test/SemaCXX/cxx0x-initializer-constructor.cpp

index 5ee28da4efa773a4704b49eefcf7bd6f37abd75e..7c97453d6fc1345317500e53774ee15a5d619643 100644 (file)
@@ -1702,7 +1702,11 @@ Sema::ActOnCXXInClassMemberInitializer(Decl *D, SourceLocation InitLoc,
   }
 
   ExprResult Init = InitExpr;
-  if (!FD->getType()->isDependentType() && !InitExpr->isTypeDependent()) {
+  if (!FD->getType()->isDependentType() && !InitExpr->isTypeDependent() &&
+      !FD->getDeclContext()->isDependentContext()) {
+    // Note: We don't type-check when we're in a dependent context, because
+    // the initialization-substitution code does not properly handle direct
+    // list initialization. We have the same hackaround for ctor-initializers.
     if (isa<InitListExpr>(InitExpr) && isStdInitializerList(FD->getType(), 0)) {
       Diag(FD->getLocation(), diag::warn_dangling_std_initializer_list)
         << /*at end of ctor*/1 << InitExpr->getSourceRange();
index 223e140ffc02067bdcf8f3f857772fc3ab13aed5..a657ec81a140f6a4b6940e332eb158e57b857053 100644 (file)
@@ -304,3 +304,19 @@ namespace init_list_default {
   };
   B b {}; // calls default constructor
 }
+
+
+// <rdar://problem/11974632>
+namespace rdar11974632 {
+  struct X {
+    X(const X&) = delete;
+    X(int);
+  };
+
+  template<typename T>
+  struct Y { 
+    X x{1};
+  };
+
+  Y<int> yi;
+}