r194213 - PR17615: A delegating constructor initializer is a full-expression. Don't
Richard Smith
richard-llvm at metafoo.co.uk
Thu Nov 7 10:45:03 PST 2013
Author: rsmith
Date: Thu Nov 7 12:45:03 2013
New Revision: 194213
URL: http://llvm.org/viewvc/llvm-project?rev=194213&view=rev
Log:
PR17615: A delegating constructor initializer is a full-expression. Don't
forget to clean up temporaries at the end of it.
Modified:
cfe/trunk/lib/AST/ExprConstant.cpp
cfe/trunk/test/SemaCXX/constant-expression-cxx1y.cpp
Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=194213&r1=194212&r2=194213&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Thu Nov 7 12:45:03 2013
@@ -3623,8 +3623,11 @@ static bool HandleConstructorCall(Source
// If it's a delegating constructor, just delegate.
if (Definition->isDelegatingConstructor()) {
CXXConstructorDecl::init_const_iterator I = Definition->init_begin();
- if (!EvaluateInPlace(Result, Info, This, (*I)->getInit()))
- return false;
+ {
+ FullExpressionRAII InitScope(Info);
+ if (!EvaluateInPlace(Result, Info, This, (*I)->getInit()))
+ return false;
+ }
return EvaluateStmt(Result, Info, Definition->getBody()) != ESR_Failed;
}
Modified: cfe/trunk/test/SemaCXX/constant-expression-cxx1y.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constant-expression-cxx1y.cpp?rev=194213&r1=194212&r2=194213&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/constant-expression-cxx1y.cpp (original)
+++ cfe/trunk/test/SemaCXX/constant-expression-cxx1y.cpp Thu Nov 7 12:45:03 2013
@@ -887,3 +887,14 @@ namespace Bitfields {
}
static_assert(test(), "");
}
+
+namespace PR17615 {
+ struct A {
+ int &&r;
+ constexpr A(int &&r) : r(static_cast<int &&>(r)) {}
+ constexpr A() : A(0) {
+ (void)+r; // expected-note {{outside its lifetime}}
+ }
+ };
+ constexpr int k = A().r; // expected-error {{constant expression}} expected-note {{in call to}}
+}
More information about the cfe-commits
mailing list