Re-enabled truncation/extension checking in IdempotentOperationChecker and added a test case.
llvm-svn: 113269
This commit is contained in:
parent
95852755a8
commit
bc9eaef24c
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue