diff options
author | Tom Care <tom.care@uqconnect.edu.au> | 2010-08-16 21:43:52 +0000 |
---|---|---|
committer | Tom Care <tom.care@uqconnect.edu.au> | 2010-08-16 21:43:52 +0000 |
commit | 50e8ac2369951d200e0d3849465d481f20fbdb62 (patch) | |
tree | b56a7022c7bebb97f4f32166d45f4db18518882a /lib/Checker/IdempotentOperationChecker.cpp | |
parent | 5535d5721b6bfb5df9583bc0632da910a176109d (diff) |
Added basic psuedoconstant checking in IdempotentOperationChecker and fixed some test cases.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111190 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Checker/IdempotentOperationChecker.cpp')
-rw-r--r-- | lib/Checker/IdempotentOperationChecker.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/lib/Checker/IdempotentOperationChecker.cpp b/lib/Checker/IdempotentOperationChecker.cpp index 74f4a62ccc..4f2810ea94 100644 --- a/lib/Checker/IdempotentOperationChecker.cpp +++ b/lib/Checker/IdempotentOperationChecker.cpp @@ -81,6 +81,7 @@ class IdempotentOperationChecker const CFGBlock *CB, const GRCoreEngine &CE); static bool CanVary(const Expr *Ex, ASTContext &Ctx); + static bool isPseudoConstant(const DeclRefExpr *D); // Hash table typedef llvm::DenseMap<const BinaryOperator *, @@ -530,8 +531,7 @@ bool IdempotentOperationChecker::CanVary(const Expr *Ex, ASTContext &Ctx) { return SE->getTypeOfArgument()->isVariableArrayType(); } case Stmt::DeclRefExprClass: - // return !IsPseudoConstant(cast<DeclRefExpr>(Ex)); - return true; + return !isPseudoConstant(cast<DeclRefExpr>(Ex)); // The next cases require recursion for subexpressions case Stmt::BinaryOperatorClass: { @@ -555,3 +555,17 @@ bool IdempotentOperationChecker::CanVary(const Expr *Ex, ASTContext &Ctx) { } } +// Returns true if a DeclRefExpr behaves like a constant. +bool IdempotentOperationChecker::isPseudoConstant(const DeclRefExpr *DR) { + // Check for an enum + if (isa<EnumConstantDecl>(DR->getDecl())) + return true; + + // Check for a static variable + // FIXME: Analysis should model static vars + if (const VarDecl *VD = dyn_cast<VarDecl>(DR->getDecl())) + if (VD->isStaticLocal()) + return true; + + return false; +} |