r286748 - Fix PR28366: Handle variables from enclosing local scopes more gracefully during constant expression evaluation.
Vedant Kumar via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 14 14:32:54 PST 2016
Reverting this commit doesn't solve anything, sorry for the noise.
It seems to hit an infinite loop:
frame #17: 0x00000001083d48ab clang`::Visit() [inlined] HandleConditionalOperator<clang::ConditionalOperator> + 165 at ExprConstant.cpp:4212
frame #18: 0x00000001083d4806 clang`::Visit() [inlined] VisitConditionalOperator at ExprConstant.cpp:4331
frame #19: 0x00000001083d4806 clang`::Visit() + 33158 at StmtNodes.inc:129
frame #20: 0x000000010835c43c clang`::Evaluate() + 1468 at ExprConstant.cpp:9155
frame #21: 0x00000001083bad54 clang`::EvaluateStmt() + 15572 at ExprConstant.cpp:3663
frame #22: 0x00000001083b9147 clang`::EvaluateStmt() + 8391 at ExprConstant.cpp:3673
frame #23: 0x0000000108360829 clang`::HandleFunctionCall() + 1657 at ExprConstant.cpp:3994
frame #24: 0x000000010842f681 clang`::handleCallExpr() + 3697 at ExprConstant.cpp:4438
frame #25: 0x00000001083ea4c5 clang`::VisitCallExpr() [inlined] VisitCallExpr + 54 at ExprConstant.cpp:4355
frame #26: 0x00000001083ea48f clang`::VisitCallExpr() + 11407 at ExprConstant.cpp:6937
frame #27: 0x00000001083ccdcd clang`::Visit() + 1869 at Expr.h:1705
frame #28: 0x000000010835c43c clang`::Evaluate() + 1468 at ExprConstant.cpp:9155
frame #29: 0x00000001083cf094 clang`::Visit() [inlined] VisitBinaryConditionalOperator + 145 at ExprConstant.cpp:4307
frame #30: 0x00000001083cf003 clang`::Visit() + 10627 at StmtNodes.inc:123
frame #31: 0x00000001083d1b7f clang`::Visit() + 21759 at ExprCXX.h:2998
frame #32: 0x00000001083d48ab clang`::Visit() [inlined] HandleConditionalOperator<clang::ConditionalOperator> + 165 at ExprConstant.cpp:4212
sudo ulimit -s 65000 && lldb /Users/buildslave/jenkins/workspace/clangsan-branch-R-nobootstrap-cmake/clang-build/./bin/clang -- -cc1 -internal-isystem /Users/buildslave/jenkins/workspace/clangsan-branch-R-nobootstrap-cmake/clang-build/bin/../lib/clang/4.0.0/include -nostdsysteminc -triple i686-linux -Wno-string-plus-int -Wno-pointer-arith -Wno-zero-length-array -fsyntax-only -fcxx-exceptions -verify -std=c++11 -pedantic /Users/buildslave/jenkins/workspace/clangsan-branch-R-nobootstrap-cmake/clang/src/tools/clang/test/SemaCXX/constant-expression-cxx11.cpp -Wno-comment -Wno-tautological-pointer-compare -Wno-bool-conversion
vedant
> On Nov 14, 2016, at 1:56 PM, Vedant Kumar <vsk at apple.com> wrote:
>
> Hi Faisal,
>
> Our ASan bot started complaining after this commit.
>
> I'm not 100% sure this caused it yet, though I'm running tests.
>
> Could you take a look?
>
> thanks,
> vedant
>
>
> FAIL: Clang :: SemaCXX/constant-expression-cxx11.cpp (9393 of 29261)
>
> ******************** TEST 'Clang :: SemaCXX/constant-expression-cxx11.cpp' FAILED ********************
>
> Script:
> --
> ulimit -s 10000 && /Users/buildslave/jenkins/workspace/clangsan-branch-R-nobootstrap-cmake/clang-build/./bin/clang -cc1 -internal-isystem /Users/buildslave/jenkins/workspace/clangsan-branch-R-nobootstrap-cmake/clang-build/bin/../lib/clang/4.0.0/include -nostdsysteminc -triple i686-linux -Wno-string-plus-int -Wno-pointer-arith -Wno-zero-length-array -fsyntax-only -fcxx-exceptions -verify -std=c++11 -pedantic /Users/buildslave/jenkins/workspace/clangsan-branch-R-nobootstrap-cmake/clang/src/tools/clang/test/SemaCXX/constant-expression-cxx11.cpp -Wno-comment -Wno-tautological-pointer-compare -Wno-bool-conversion
> --
> Exit Code: 134
>
> Command Output (stderr):
> --
> ASAN:DEADLYSIGNAL
> =================================================================
> ==86262==ERROR: AddressSanitizer: stack-overflow on address 0x7fff50fda580 (pc 0x0001165bcf2d bp 0x7fff50fdb1f0 sp 0x7fff50fda580 T0)
> #0 0x1165bcf2c in Evaluate(clang::APValue&, (anonymous namespace)::EvalInfo&, clang::Expr const*) ExprConstant.cpp:9142
>
> SUMMARY: AddressSanitizer: stack-overflow ExprConstant.cpp:9142 in Evaluate(clang::APValue&, (anonymous namespace)::EvalInfo&, clang::Expr const*)
> ==86262==ABORTING
> Stack dump:
> 0. Program arguments: /Users/buildslave/jenkins/workspace/clangsan-branch-R-nobootstrap-cmake/clang-build/./bin/clang -cc1 -internal-isystem /Users/buildslave/jenkins/workspace/clangsan-branch-R-nobootstrap-cmake/clang-build/bin/../lib/clang/4.0.0/include -nostdsysteminc -triple i686-linux -Wno-string-plus-int -Wno-pointer-arith -Wno-zero-length-array -fsyntax-only -fcxx-exceptions -verify -std=c++11 -pedantic /Users/buildslave/jenkins/workspace/clangsan-branch-R-nobootstrap-cmake/clang/src/tools/clang/test/SemaCXX/constant-expression-cxx11.cpp -Wno-comment -Wno-tautological-pointer-compare -Wno-bool-conversion
> 1. /Users/buildslave/jenkins/workspace/clangsan-branch-R-nobootstrap-cmake/clang/src/tools/clang/test/SemaCXX/constant-expression-cxx11.cpp:1457:1: current parser token '}'
> 2. /Users/buildslave/jenkins/workspace/clangsan-branch-R-nobootstrap-cmake/clang/src/tools/clang/test/SemaCXX/constant-expression-cxx11.cpp:1435:1: parsing namespace 'RecursiveOpaqueExpr'
> /Users/buildslave/jenkins/workspace/clangsan-branch-R-nobootstrap-cmake/clang-build/tools/clang/test/SemaCXX/Output/constant-expression-cxx11.cpp.script: line 1: 86262 Abort trap: 6 /Users/buildslave/jenkins/workspace/clangsan-branch-R-nobootstrap-cmake/clang-build/./bin/clang -cc1 -internal-isystem /Users/buildslave/jenkins/workspace/clangsan-branch-R-nobootstrap-cmake/clang-build/bin/../lib/clang/4.0.0/include -nostdsysteminc -triple i686-linux -Wno-string-plus-int -Wno-pointer-arith -Wno-zero-length-array -fsyntax-only -fcxx-exceptions -verify -std=c++11 -pedantic /Users/buildslave/jenkins/workspace/clangsan-branch-R-nobootstrap-cmake/clang/src/tools/clang/test/SemaCXX/constant-expression-cxx11.cpp -Wno-comment -Wno-tautological-pointer-compare -Wno-bool-conversion
>
>
>
>> On Nov 12, 2016, at 10:09 PM, Faisal Vali via cfe-commits <cfe-commits at lists.llvm.org> wrote:
>>
>> Author: faisalv
>> Date: Sun Nov 13 00:09:16 2016
>> New Revision: 286748
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=286748&view=rev
>> Log:
>> Fix PR28366: Handle variables from enclosing local scopes more gracefully during constant expression evaluation.
>>
>> Only look for a variable's value in the constant expression evaluation activation frame, if the variable was indeed declared in that frame, otherwise it might be a constant expression and be usable within a nested local scope or emit an error.
>>
>>
>> void f(char c) {
>> struct X {
>> static constexpr char f() {
>> return c; // error gracefully here as opposed to crashing.
>> }
>> };
>> int I = X::f();
>> }
>>
>>
>> Modified:
>> cfe/trunk/lib/AST/ExprConstant.cpp
>> cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
>> cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp
>> cfe/trunk/test/SemaCXX/cxx1z-constexpr-lambdas.cpp
>>
>> Modified: cfe/trunk/lib/AST/ExprConstant.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=286748&r1=286747&r2=286748&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/AST/ExprConstant.cpp (original)
>> +++ cfe/trunk/lib/AST/ExprConstant.cpp Sun Nov 13 00:09:16 2016
>> @@ -4803,10 +4803,21 @@ bool LValueExprEvaluator::VisitDeclRefEx
>> return Error(E);
>> }
>>
>> +
>> bool LValueExprEvaluator::VisitVarDecl(const Expr *E, const VarDecl *VD) {
>> CallStackFrame *Frame = nullptr;
>> - if (VD->hasLocalStorage() && Info.CurrentCall->Index > 1)
>> - Frame = Info.CurrentCall;
>> + if (VD->hasLocalStorage() && Info.CurrentCall->Index > 1) {
>> + // Only if a local variable was declared in the function currently being
>> + // evaluated, do we expect to be able to find its value in the current
>> + // frame. (Otherwise it was likely declared in an enclosing context and
>> + // could either have a valid evaluatable value (for e.g. a constexpr
>> + // variable) or be ill-formed (and trigger an appropriate evaluation
>> + // diagnostic)).
>> + if (Info.CurrentCall->Callee &&
>> + Info.CurrentCall->Callee->Equals(VD->getDeclContext())) {
>> + Frame = Info.CurrentCall;
>> + }
>> + }
>>
>> if (!VD->getType()->isReferenceType()) {
>> if (Frame) {
>>
>> Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=286748&r1=286747&r2=286748&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Sun Nov 13 00:09:16 2016
>> @@ -188,7 +188,7 @@ static void instantiateDependentEnableIf
>>
>> SmallVector<PartialDiagnosticAt, 8> Diags;
>> if (A->getCond()->isValueDependent() && !Cond->isValueDependent() &&
>> - !Expr::isPotentialConstantExprUnevaluated(Cond, cast<FunctionDecl>(Tmpl),
>> + !Expr::isPotentialConstantExprUnevaluated(Cond, cast<FunctionDecl>(New),
>> Diags)) {
>> S.Diag(A->getLocation(), diag::err_enable_if_never_constant_expr);
>> for (int I = 0, N = Diags.size(); I != N; ++I)
>>
>> Modified: cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp?rev=286748&r1=286747&r2=286748&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp (original)
>> +++ cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp Sun Nov 13 00:09:16 2016
>> @@ -2066,3 +2066,33 @@ namespace InheritedCtor {
>> constexpr Z z(1);
>> static_assert(z.w == 1 && z.x == 2 && z.y == 3 && z.z == 4, "");
>> }
>> +
>> +
>> +namespace PR28366 {
>> +namespace ns1 {
>> +
>> +void f(char c) { //expected-note2{{declared here}}
>> + struct X {
>> + static constexpr char f() { //expected-error{{never produces a constant expression}}
>> + return c; //expected-error{{reference to local}} expected-note{{non-const variable}}
>> + }
>> + };
>> + int I = X::f();
>> +}
>> +
>> +void g() {
>> + const int c = 'c';
>> + static const int d = 'd';
>> + struct X {
>> + static constexpr int f() {
>> + return c + d;
>> + }
>> + };
>> + static_assert(X::f() == 'c' + 'd',"");
>> +}
>> +
>> +
>> +} // end ns1
>> +
>> +} //end ns PR28366
>> +
>>
>> Modified: cfe/trunk/test/SemaCXX/cxx1z-constexpr-lambdas.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx1z-constexpr-lambdas.cpp?rev=286748&r1=286747&r2=286748&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/SemaCXX/cxx1z-constexpr-lambdas.cpp (original)
>> +++ cfe/trunk/test/SemaCXX/cxx1z-constexpr-lambdas.cpp Sun Nov 13 00:09:16 2016
>> @@ -46,5 +46,17 @@ namespace ns3 {
>>
>> } // end ns test_constexpr_call
>>
>> -#endif // ndef CPP14_AND_EARLIER
>> +namespace test_captureless_lambda {
>> +void f() {
>> + const char c = 'c';
>> + auto L = [] { return c; };
>> + constexpr char C = L();
>> +}
>> +
>> +void f(char c) { //expected-note{{declared here}}
>> + auto L = [] { return c; }; //expected-error{{cannot be implicitly captured}} expected-note{{lambda expression begins here}}
>> + int I = L();
>> +}
>>
>> +}
>> +#endif // ndef CPP14_AND_EARLIER
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list