]> granicus.if.org Git - clang/commitdiff
Merging r200954:
authorTom Stellard <thomas.stellard@amd.com>
Mon, 17 Mar 2014 16:39:03 +0000 (16:39 +0000)
committerTom Stellard <thomas.stellard@amd.com>
Mon, 17 Mar 2014 16:39:03 +0000 (16:39 +0000)
------------------------------------------------------------------------
r200954 | richard-llvm | 2014-02-06 15:35:16 -0800 (Thu, 06 Feb 2014) | 9 lines

Temporary fix for PR18473: Don't try to evaluate the initializer for a
type-dependent variable, even if the initializer isn't value-dependent.  This
happens for ParenListExprs composed of non-value-dependent subexpressions, for
instance.

We should really give ParenListExprs (and InitListExprs) the type of the
initialized entity if they're used to represent a dependent initialization (and
if so, set them to be type-, value- and instantiation-dependent).

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

lib/Sema/SemaExprCXX.cpp
test/SemaCXX/lambda-expressions.cpp

index 07e465766b74fae361f2f489deb869f7fc055466..20118b57126dba67730cbceff472db306b38f0c0 100644 (file)
@@ -5836,17 +5836,16 @@ static inline bool VariableCanNeverBeAConstantExpression(VarDecl *Var,
   assert(DefVD);
   if (DefVD->isWeak()) return false;
   EvaluatedStmt *Eval = DefVD->ensureEvaluatedStmt();
-  
+
   Expr *Init = cast<Expr>(Eval->Value);
 
   if (Var->getType()->isDependentType() || Init->isValueDependent()) {
-    if (!Init->isValueDependent())
-      return !DefVD->checkInitIsICE();
-    // FIXME: We might still be able to do some analysis of Init here
-    // to conclude that even in a dependent setting, Init can never
-    // be a constexpr - but for now admit agnosticity.
+    // FIXME: Teach the constant evaluator to deal with the non-dependent parts
+    // of value-dependent expressions, and use it here to determine whether the
+    // initializer is a potential constant expression.
     return false;
-  } 
+  }
+
   return !IsVariableAConstantExpression(Var, Context); 
 }
 
index e2904247c4b440ab98bb770d7cc9c1c332600fd0..65f4856dda24c10ef54d9acb6df2372cd202886d 100644 (file)
@@ -282,4 +282,19 @@ namespace lambdas_in_NSDMIs {
     };
     L l; 
   }
-}
\ No newline at end of file
+}
+
+namespace PR18473 {
+  template<typename T> void f() {
+    T t(0);
+    (void) [=]{ int n = t; }; // expected-error {{deleted}}
+  }
+
+  template void f<int>();
+  struct NoCopy {
+    NoCopy(int);
+    NoCopy(const NoCopy &) = delete; // expected-note {{deleted}}
+    operator int() const;
+  };
+  template void f<NoCopy>(); // expected-note {{instantiation}}
+}