Re-enabled truncation/extension checking in IdempotentOperationChecker and added a test case.

llvm-svn: 113269
This commit is contained in:
Tom Care 2010-09-07 20:27:56 +00:00
parent 95852755a8
commit bc9eaef24c
2 changed files with 12 additions and 6 deletions

View File

@ -78,8 +78,8 @@ class IdempotentOperationChecker
// False positive reduction methods // False positive reduction methods
static bool isSelfAssign(const Expr *LHS, const Expr *RHS); static bool isSelfAssign(const Expr *LHS, const Expr *RHS);
static bool isUnused(const Expr *E, AnalysisContext *AC); static bool isUnused(const Expr *E, AnalysisContext *AC);
//static bool isTruncationExtensionAssignment(const Expr *LHS, static bool isTruncationExtensionAssignment(const Expr *LHS,
// const Expr *RHS); const Expr *RHS);
static bool PathWasCompletelyAnalyzed(const CFG *C, static bool PathWasCompletelyAnalyzed(const CFG *C,
const CFGBlock *CB, const CFGBlock *CB,
const GRCoreEngine &CE); const GRCoreEngine &CE);
@ -196,9 +196,10 @@ void IdempotentOperationChecker::PreVisitBinaryOperator(
case BO_Assign: case BO_Assign:
// x Assign x can be used to silence unused variable warnings intentionally. // x Assign x can be used to silence unused variable warnings intentionally.
// If this is a self assignment and the variable is referenced elsewhere, // 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 (isSelfAssign(LHS, RHS)) {
if (!isUnused(LHS, AC)) { if (!isUnused(LHS, AC) && !isTruncationExtensionAssignment(LHS, RHS)) {
UpdateAssumption(A, Equal); UpdateAssumption(A, Equal);
return; return;
} }
@ -500,7 +501,6 @@ bool IdempotentOperationChecker::isUnused(const Expr *E,
return true; return true;
} }
#if 0
// Check for self casts truncating/extending a variable // Check for self casts truncating/extending a variable
bool IdempotentOperationChecker::isTruncationExtensionAssignment( bool IdempotentOperationChecker::isTruncationExtensionAssignment(
const Expr *LHS, const Expr *LHS,
@ -523,7 +523,6 @@ bool IdempotentOperationChecker::isTruncationExtensionAssignment(
return dyn_cast<DeclRefExpr>(RHS->IgnoreParens()) == NULL; return dyn_cast<DeclRefExpr>(RHS->IgnoreParens()) == NULL;
} }
#endif
// Returns false if a path to this block was not completely analyzed, or true // Returns false if a path to this block was not completely analyzed, or true
// otherwise. // otherwise.

View File

@ -187,3 +187,10 @@ int false7() {
return a; return a;
} }
// Check truncations do not flag as self-assignments
void false8() {
int a = 10000000;
a = (short)a; // no-warning
test(a);
}