aboutsummaryrefslogtreecommitdiff
path: root/lib/Checker
diff options
context:
space:
mode:
authorTom Care <tom.care@uqconnect.edu.au>2010-09-07 20:27:56 +0000
committerTom Care <tom.care@uqconnect.edu.au>2010-09-07 20:27:56 +0000
commit84c24ed29e0bb37fc06a584e0df5bdfbe49efc8f (patch)
treeafdbba40ab3ba044c8741fc8f1ef8cf0e73215c6 /lib/Checker
parent3aa2146552fafac2b5ba24a42d28861d22fe3175 (diff)
Re-enabled truncation/extension checking in IdempotentOperationChecker and added a test case.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113269 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Checker')
-rw-r--r--lib/Checker/IdempotentOperationChecker.cpp11
1 files changed, 5 insertions, 6 deletions
diff --git a/lib/Checker/IdempotentOperationChecker.cpp b/lib/Checker/IdempotentOperationChecker.cpp
index 6411c790ef..2e85013a76 100644
--- a/lib/Checker/IdempotentOperationChecker.cpp
+++ b/lib/Checker/IdempotentOperationChecker.cpp
@@ -78,8 +78,8 @@ class IdempotentOperationChecker
// False positive reduction methods
static bool isSelfAssign(const Expr *LHS, const Expr *RHS);
static bool isUnused(const Expr *E, AnalysisContext *AC);
- //static bool isTruncationExtensionAssignment(const Expr *LHS,
- // const Expr *RHS);
+ static bool isTruncationExtensionAssignment(const Expr *LHS,
+ const Expr *RHS);
static bool PathWasCompletelyAnalyzed(const CFG *C,
const CFGBlock *CB,
const GRCoreEngine &CE);
@@ -196,9 +196,10 @@ void IdempotentOperationChecker::PreVisitBinaryOperator(
case BO_Assign:
// x Assign x can be used to silence unused variable warnings intentionally.
// If this is a self assignment and the variable is referenced elsewhere,
- // then it is a false positive.
+ // and the assignment is not a truncation or extension, then it is a false
+ // positive.
if (isSelfAssign(LHS, RHS)) {
- if (!isUnused(LHS, AC)) {
+ if (!isUnused(LHS, AC) && !isTruncationExtensionAssignment(LHS, RHS)) {
UpdateAssumption(A, Equal);
return;
}
@@ -500,7 +501,6 @@ bool IdempotentOperationChecker::isUnused(const Expr *E,
return true;
}
-#if 0
// Check for self casts truncating/extending a variable
bool IdempotentOperationChecker::isTruncationExtensionAssignment(
const Expr *LHS,
@@ -523,7 +523,6 @@ bool IdempotentOperationChecker::isTruncationExtensionAssignment(
return dyn_cast<DeclRefExpr>(RHS->IgnoreParens()) == NULL;
}
-#endif
// Returns false if a path to this block was not completely analyzed, or true
// otherwise.