diff options
author | DeLesley Hutchins <delesley@google.com> | 2012-07-03 18:25:56 +0000 |
---|---|---|
committer | DeLesley Hutchins <delesley@google.com> | 2012-07-03 18:25:56 +0000 |
commit | 9d6e7f3e12f1a825377ace33161e80caeda8cd06 (patch) | |
tree | 2e3c2779c8a60a56df8421fd45ed0c76ff06f960 /lib/Analysis/ThreadSafety.cpp | |
parent | 57aceb227d192ce41f5412a53d451354e90dd792 (diff) |
Thread Safety Analysis: handle expressions involving temporaries,
e.g. ExprWithCleanups.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159674 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/ThreadSafety.cpp')
-rw-r--r-- | lib/Analysis/ThreadSafety.cpp | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/lib/Analysis/ThreadSafety.cpp b/lib/Analysis/ThreadSafety.cpp index f9d93ee0df..238a888194 100644 --- a/lib/Analysis/ThreadSafety.cpp +++ b/lib/Analysis/ThreadSafety.cpp @@ -206,15 +206,17 @@ class MutexID { buildMutexID(CE->getSubExpr(), CallCtx); } else if (ParenExpr *PE = dyn_cast<ParenExpr>(Exp)) { buildMutexID(PE->getSubExpr(), CallCtx); + } else if (ExprWithCleanups *EWC = dyn_cast<ExprWithCleanups>(Exp)) { + buildMutexID(EWC->getSubExpr(), CallCtx); } else if (isa<CharacterLiteral>(Exp) || - isa<CXXNullPtrLiteralExpr>(Exp) || - isa<GNUNullExpr>(Exp) || - isa<CXXBoolLiteralExpr>(Exp) || - isa<FloatingLiteral>(Exp) || - isa<ImaginaryLiteral>(Exp) || - isa<IntegerLiteral>(Exp) || - isa<StringLiteral>(Exp) || - isa<ObjCStringLiteral>(Exp)) { + isa<CXXNullPtrLiteralExpr>(Exp) || + isa<GNUNullExpr>(Exp) || + isa<CXXBoolLiteralExpr>(Exp) || + isa<FloatingLiteral>(Exp) || + isa<ImaginaryLiteral>(Exp) || + isa<IntegerLiteral>(Exp) || + isa<StringLiteral>(Exp) || + isa<ObjCStringLiteral>(Exp)) { return; // FIXME: Ignore literals for now } else { // Ignore. FIXME: mark as invalid expression? @@ -1523,6 +1525,10 @@ void BuildLockset::VisitDeclStmt(DeclStmt *S) { Decl *D = *I; if (VarDecl *VD = dyn_cast_or_null<VarDecl>(D)) { Expr *E = VD->getInit(); + // handle constructors that involve temporaries + if (ExprWithCleanups *EWC = dyn_cast_or_null<ExprWithCleanups>(E)) + E = EWC->getSubExpr(); + if (CXXConstructExpr *CE = dyn_cast_or_null<CXXConstructExpr>(E)) { NamedDecl *CtorD = dyn_cast_or_null<NamedDecl>(CE->getConstructor()); if (!CtorD || !CtorD->hasAttrs()) |