aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2011-07-22 05:27:52 +0000
committerChandler Carruth <chandlerc@gmail.com>2011-07-22 05:27:52 +0000
commitd837c0dc361a000b951593eaaa80c46b73d15b1d (patch)
treeffc7bdba6c1a388c41ac76f918663173ffa12f7d
parentba3dd902d1cde09776a50c1adf2cd40bf0a15a7f (diff)
Move duplicate uninitialized warning suppression into the
AnalysisBasedWarnings Sema layer and out of the Analysis library itself. This returns the uninitialized values analysis to a more pure form, allowing its original logic to correctly detect some categories of definitely uninitialized values. Fixes PR10358 (again). Thanks to Ted for reviewing and updating this patch after his rewrite of several portions of this analysis. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@135748 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Analysis/UninitializedValues.cpp10
-rw-r--r--lib/Sema/AnalysisBasedWarnings.cpp12
-rw-r--r--test/Sema/uninit-variables.c8
3 files changed, 12 insertions, 18 deletions
diff --git a/lib/Analysis/UninitializedValues.cpp b/lib/Analysis/UninitializedValues.cpp
index 67f0f6740e..4301ca1293 100644
--- a/lib/Analysis/UninitializedValues.cpp
+++ b/lib/Analysis/UninitializedValues.cpp
@@ -493,7 +493,8 @@ void TransferFunctions::VisitBinaryOperator(clang::BinaryOperator *bo) {
if (isUninitialized(val)) {
if (bo->getOpcode() != BO_Assign)
reportUninit(res.getDeclRefExpr(), vd, isAlwaysUninit(val));
- val = Initialized;
+ else
+ val = Initialized;
}
}
}
@@ -513,11 +514,8 @@ void TransferFunctions::VisitUnaryOperator(clang::UnaryOperator *uo) {
lastDR = 0;
ValueVector::reference val = vals[vd];
- if (isUninitialized(val)) {
+ if (isUninitialized(val))
reportUninit(res.getDeclRefExpr(), vd, isAlwaysUninit(val));
- // Don't cascade warnings.
- val = Initialized;
- }
}
break;
}
@@ -575,8 +573,6 @@ void TransferFunctions::ProcessUses(Stmt *s) {
reportUninit(DR, VD, isAlwaysUninit(vals[VD]));
lastLoad = 0;
- // Prevent cascade of warnings.
- vals[VD] = Initialized;
if (DR == lastDR) {
lastDR = 0;
return;
diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp
index 06e42b7728..3dae7b4d7e 100644
--- a/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/lib/Sema/AnalysisBasedWarnings.cpp
@@ -560,8 +560,6 @@ public:
const VarDecl *vd = i->first;
UsesVec *vec = i->second;
- bool fixitIssued = false;
-
// Sort the uses by their SourceLocations. While not strictly
// guaranteed to produce them in line/column order, this will provide
// a stable ordering.
@@ -573,11 +571,11 @@ public:
/*isAlwaysUninit=*/vi->second))
continue;
- // Suggest a fixit hint the first time we diagnose a use of a variable.
- if (!fixitIssued) {
- SuggestInitializationFixit(S, vd);
- fixitIssued = true;
- }
+ SuggestInitializationFixit(S, vd);
+
+ // Skip further diagnostics for this variable. We try to warn only on
+ // the first point at which a variable is used uninitialized.
+ break;
}
delete vec;
diff --git a/test/Sema/uninit-variables.c b/test/Sema/uninit-variables.c
index 914156da8b..2c91ecc271 100644
--- a/test/Sema/uninit-variables.c
+++ b/test/Sema/uninit-variables.c
@@ -77,7 +77,7 @@ int test11(unsigned n) {
}
void test12(unsigned n) {
- for (unsigned i ; n ; ++i) ; // expected-warning{{variable 'i' may be uninitialized when used here}} expected-note{{variable 'i' is declared here}} expected-note{{add initialization to silence this warning}}
+ for (unsigned i ; n ; ++i) ; // expected-warning{{variable 'i' is uninitialized when used here}} expected-note{{variable 'i' is declared here}} expected-note{{add initialization to silence this warning}}
}
int test13() {
@@ -237,7 +237,7 @@ void test36()
void **pc; // expected-note{{variable 'pc' is declared here}} expected-note{{add initialization to silence this warning}}
void *dummy[] = { &&L1, &&L2 };
L1:
- goto *pc; // expected-warning{{variable 'pc' may be uninitialized when used here}}
+ goto *pc; // expected-warning{{variable 'pc' is uninitialized when used here}}
L2:
goto *pc;
}
@@ -289,7 +289,7 @@ void test43_aux(int x);
void test43(int i) {
int x; // expected-note {{variable 'x' is declared here}} expected-note{{add initialization to silence this warning}}
for (i = 0 ; i < 10; i++)
- test43_aux(x++); // expected-warning {{variable 'x' may be uninitialized when used here}}
+ test43_aux(x++); // expected-warning {{variable 'x' is uninitialized when used here}}
}
void test44(int i) {
@@ -297,7 +297,7 @@ void test44(int i) {
int y; // expected-note {{variable 'y' is declared here}} expected-note{{add initialization to silence this warning}}
for (i = 0; i < 10; i++ ) {
test43_aux(x++); // no-warning
- x += y; // expected-warning {{variable 'y' may be uninitialized when used here}}
+ x += y; // expected-warning {{variable 'y' is uninitialized when used here}}
}
}