diff options
author | DeLesley Hutchins <delesley@google.com> | 2012-07-03 19:47:18 +0000 |
---|---|---|
committer | DeLesley Hutchins <delesley@google.com> | 2012-07-03 19:47:18 +0000 |
commit | 96fac6a7fe89deff7860e536febbd4ae17bb57f3 (patch) | |
tree | 79a895bcaf1f936765c600a3b37b9fd8b8b64a49 /lib/Analysis/ThreadSafety.cpp | |
parent | c359f2029d19016560a422551704ccc2419be0b1 (diff) |
Thread safety analysis: improve handling of smart pointers.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159679 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/ThreadSafety.cpp')
-rw-r--r-- | lib/Analysis/ThreadSafety.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/lib/Analysis/ThreadSafety.cpp b/lib/Analysis/ThreadSafety.cpp index 238a888194..fb53d076a4 100644 --- a/lib/Analysis/ThreadSafety.cpp +++ b/lib/Analysis/ThreadSafety.cpp @@ -26,6 +26,7 @@ #include "clang/AST/StmtVisitor.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/SourceLocation.h" +#include "clang/Basic/OperatorKinds.h" #include "llvm/ADT/BitVector.h" #include "llvm/ADT/FoldingSet.h" #include "llvm/ADT/ImmutableMap.h" @@ -162,6 +163,13 @@ class MutexID { buildMutexID(At->getArg(), &LRCallCtx); return; } + // Hack to treat smart pointers and iterators as pointers; + // ignore any method named get(). + if (CMCE->getMethodDecl()->getNameAsString() == "get" && + CMCE->getNumArgs() == 0) { + buildMutexID(CMCE->getImplicitObjectArgument(), CallCtx); + return; + } DeclSeq.push_back(CMCE->getMethodDecl()->getCanonicalDecl()); buildMutexID(CMCE->getImplicitObjectArgument(), CallCtx); unsigned NumCallArgs = CMCE->getNumArgs(); @@ -179,6 +187,15 @@ class MutexID { buildMutexID(At->getArg(), &LRCallCtx); return; } + // Treat smart pointers and iterators as pointers; + // ignore the * and -> operators. + if (CXXOperatorCallExpr *OE = dyn_cast<CXXOperatorCallExpr>(CE)) { + OverloadedOperatorKind k = OE->getOperator(); + if (k == OO_Arrow || k == OO_Star) { + buildMutexID(OE->getArg(0), CallCtx); + return; + } + } buildMutexID(CE->getCallee(), CallCtx); unsigned NumCallArgs = CE->getNumArgs(); Expr** CallArgs = CE->getArgs(); @@ -208,6 +225,8 @@ class MutexID { buildMutexID(PE->getSubExpr(), CallCtx); } else if (ExprWithCleanups *EWC = dyn_cast<ExprWithCleanups>(Exp)) { buildMutexID(EWC->getSubExpr(), CallCtx); + } else if (CXXBindTemporaryExpr *E = dyn_cast<CXXBindTemporaryExpr>(Exp)) { + buildMutexID(E->getSubExpr(), CallCtx); } else if (isa<CharacterLiteral>(Exp) || isa<CXXNullPtrLiteralExpr>(Exp) || isa<GNUNullExpr>(Exp) || |