diff options
author | Gabor Horvath <xazax.hun@gmail.com> | 2015-10-27 13:46:39 +0000 |
---|---|---|
committer | Gabor Horvath <xazax.hun@gmail.com> | 2015-10-27 13:46:39 +0000 |
commit | ba7d9071fe60e53a49a6e4daf22db332f44d0b6c (patch) | |
tree | c81578a68fd3f268c304327d2e18d93b4156da1b /clang | |
parent | bd73bcf84a948afd8e1fc39ba8eeb853b634e0d1 (diff) | |
download | bcm5719-llvm-ba7d9071fe60e53a49a6e4daf22db332f44d0b6c.tar.gz bcm5719-llvm-ba7d9071fe60e53a49a6e4daf22db332f44d0b6c.zip |
[analyzer] Fix lambdas that are capturing constants.
llvm-svn: 251407
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 21 | ||||
-rw-r--r-- | clang/test/Analysis/lambdas.cpp | 15 |
2 files changed, 29 insertions, 7 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index afef624f5dc..f6129a963f8 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1859,13 +1859,20 @@ void ExprEngine::VisitCommonDeclRefExpr(const Expr *Ex, const NamedDecl *D, FieldDecl *LambdaThisCaptureField; CXXRec->getCaptureFields(LambdaCaptureFields, LambdaThisCaptureField); const FieldDecl *FD = LambdaCaptureFields[VD]; - Loc CXXThis = - svalBuilder.getCXXThis(MD, LocCtxt->getCurrentStackFrame()); - SVal CXXThisVal = state->getSVal(CXXThis); - V = state->getLValue(FD, CXXThisVal); - if (FD->getType()->isReferenceType() && - !VD->getType()->isReferenceType()) - CaptureByReference = true; + if (!FD) { + // When a constant is captured, sometimes no corresponding field is + // created in the lambda object. + assert(VD->getType().isConstQualified()); + V = state->getLValue(VD, LocCtxt); + } else { + Loc CXXThis = + svalBuilder.getCXXThis(MD, LocCtxt->getCurrentStackFrame()); + SVal CXXThisVal = state->getSVal(CXXThis); + V = state->getLValue(FD, CXXThisVal); + if (FD->getType()->isReferenceType() && + !VD->getType()->isReferenceType()) + CaptureByReference = true; + } } else { V = state->getLValue(VD, LocCtxt); } diff --git a/clang/test/Analysis/lambdas.cpp b/clang/test/Analysis/lambdas.cpp index 36af7e1e84e..10f6d559582 100644 --- a/clang/test/Analysis/lambdas.cpp +++ b/clang/test/Analysis/lambdas.cpp @@ -195,6 +195,21 @@ struct DontCrash { } }; + +// Capture constants + +void captureConstants() { + const int i = 5; + [=]() { + if (i != 5) + clang_analyzer_warnIfReached(); + }(); + [&] { + if (i != 5) + clang_analyzer_warnIfReached(); + }(); +} + // CHECK: [B2 (ENTRY)] // CHECK: Succs (1): B1 // CHECK: [B1] |