From: Richard Smith Date: Thu, 7 Nov 2013 18:45:03 +0000 (+0000) Subject: PR17615: A delegating constructor initializer is a full-expression. Don't X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9aebdc94d819e8a537030efc70567d585382ecf9;p=clang PR17615: A delegating constructor initializer is a full-expression. Don't forget to clean up temporaries at the end of it. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@194213 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index 2412facf05..cd984a251c 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -3623,8 +3623,11 @@ static bool HandleConstructorCall(SourceLocation CallLoc, const LValue &This, // 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; } diff --git a/test/SemaCXX/constant-expression-cxx1y.cpp b/test/SemaCXX/constant-expression-cxx1y.cpp index 7a2fa44c21..136f7b198a 100644 --- a/test/SemaCXX/constant-expression-cxx1y.cpp +++ b/test/SemaCXX/constant-expression-cxx1y.cpp @@ -887,3 +887,14 @@ namespace Bitfields { } static_assert(test(), ""); } + +namespace PR17615 { + struct A { + int &&r; + constexpr A(int &&r) : r(static_cast(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}} +}