r316041 - [Analyzer] Always use non-reference types when creating expressions in BodyFarm.
George Karpenkov via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 17 15:28:18 PDT 2017
Author: george.karpenkov
Date: Tue Oct 17 15:28:18 2017
New Revision: 316041
URL: http://llvm.org/viewvc/llvm-project?rev=316041&view=rev
Log:
[Analyzer] Always use non-reference types when creating expressions in BodyFarm.
Remove an option to use a reference type (on by default!) since a
non-reference type is always needed for creating expressions, functions
with multiple boolean parameters are very hard to use, and in general it
was just a booby trap for further crashes.
Furthermore, generalize call_once test case to fix some of the crashes mentioned
https://bugs.llvm.org/show_bug.cgi?id=34869
Also removes std::call_once crash.
Differential Revision: https://reviews.llvm.org/D39015
Modified:
cfe/trunk/lib/Analysis/BodyFarm.cpp
cfe/trunk/test/Analysis/call_once.cpp
Modified: cfe/trunk/lib/Analysis/BodyFarm.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BodyFarm.cpp?rev=316041&r1=316040&r2=316041&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/BodyFarm.cpp (original)
+++ cfe/trunk/lib/Analysis/BodyFarm.cpp Tue Oct 17 15:28:18 2017
@@ -63,8 +63,7 @@ public:
/// Create a new DeclRefExpr for the referenced variable.
DeclRefExpr *makeDeclRefExpr(const VarDecl *D,
- bool RefersToEnclosingVariableOrCapture = false,
- bool GetNonReferenceType = false);
+ bool RefersToEnclosingVariableOrCapture = false);
/// Create a new UnaryOperator representing a dereference.
UnaryOperator *makeDereference(const Expr *Arg, QualType Ty);
@@ -82,8 +81,7 @@ public:
/// DeclRefExpr in the process.
ImplicitCastExpr *
makeLvalueToRvalue(const VarDecl *Decl,
- bool RefersToEnclosingVariableOrCapture = false,
- bool GetNonReferenceType = false);
+ bool RefersToEnclosingVariableOrCapture = false);
/// Create an implicit cast of the given type.
ImplicitCastExpr *makeImplicitCast(const Expr *Arg, QualType Ty,
@@ -138,12 +136,10 @@ CompoundStmt *ASTMaker::makeCompound(Arr
return new (C) CompoundStmt(C, Stmts, SourceLocation(), SourceLocation());
}
-DeclRefExpr *ASTMaker::makeDeclRefExpr(const VarDecl *D,
- bool RefersToEnclosingVariableOrCapture,
- bool GetNonReferenceType) {
- auto Type = D->getType();
- if (GetNonReferenceType)
- Type = Type.getNonReferenceType();
+DeclRefExpr *ASTMaker::makeDeclRefExpr(
+ const VarDecl *D,
+ bool RefersToEnclosingVariableOrCapture) {
+ QualType Type = D->getType().getNonReferenceType();
DeclRefExpr *DR = DeclRefExpr::Create(
C, NestedNameSpecifierLoc(), SourceLocation(), const_cast<VarDecl *>(D),
@@ -162,14 +158,10 @@ ImplicitCastExpr *ASTMaker::makeLvalueTo
ImplicitCastExpr *
ASTMaker::makeLvalueToRvalue(const VarDecl *Arg,
- bool RefersToEnclosingVariableOrCapture,
- bool GetNonReferenceType) {
- auto Type = Arg->getType();
- if (GetNonReferenceType)
- Type = Type.getNonReferenceType();
+ bool RefersToEnclosingVariableOrCapture) {
+ QualType Type = Arg->getType().getNonReferenceType();
return makeLvalueToRvalue(makeDeclRefExpr(Arg,
- RefersToEnclosingVariableOrCapture,
- GetNonReferenceType),
+ RefersToEnclosingVariableOrCapture),
Type);
}
@@ -365,12 +357,13 @@ static Stmt *create_call_once(ASTContext
// Lambda requires callback itself inserted as a first parameter.
CallArgs.push_back(
M.makeDeclRefExpr(Callback,
- /* RefersToEnclosingVariableOrCapture= */ true,
- /* GetNonReferenceType= */ true));
+ /* RefersToEnclosingVariableOrCapture= */ true));
// All arguments past first two ones are passed to the callback.
for (unsigned int i = 2; i < D->getNumParams(); i++)
- CallArgs.push_back(M.makeLvalueToRvalue(D->getParamDecl(i)));
+ CallArgs.push_back(
+ M.makeLvalueToRvalue(D->getParamDecl(i),
+ /* RefersToEnclosingVariableOrCapture= */ false));
CallExpr *CallbackCall;
if (isLambdaCall) {
@@ -385,8 +378,7 @@ static Stmt *create_call_once(ASTContext
DeclRefExpr *FlagDecl =
M.makeDeclRefExpr(Flag,
- /* RefersToEnclosingVariableOrCapture=*/true,
- /* GetNonReferenceType=*/true);
+ /* RefersToEnclosingVariableOrCapture=*/true);
MemberExpr *Deref = M.makeMemberExpression(FlagDecl, FlagFieldDecl);
Modified: cfe/trunk/test/Analysis/call_once.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/call_once.cpp?rev=316041&r1=316040&r2=316041&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/call_once.cpp (original)
+++ cfe/trunk/test/Analysis/call_once.cpp Tue Oct 17 15:28:18 2017
@@ -17,7 +17,7 @@ typedef struct once_flag_s {
#endif
template <class Callable, class... Args>
-void call_once(once_flag &o, Callable func, Args... args) {};
+void call_once(once_flag &o, Callable&& func, Args&&... args) {};
} // namespace std
More information about the cfe-commits
mailing list