aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/AnalysisBasedWarnings.cpp
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2011-04-05 18:27:05 +0000
committerChandler Carruth <chandlerc@gmail.com>2011-04-05 18:27:05 +0000
commit262d50e1dcf529317da193ad585c11c16281a7ac (patch)
tree6cef447af7143cadf1940f5dc69362fbb45cb613 /lib/Sema/AnalysisBasedWarnings.cpp
parent64fb959beb3a0ecb84a58e6ff82660a7a669f7b8 (diff)
Simplify the tracking of when to issue a fixit hint, making the helper
function more clear and obvious in behavior. Add some comments documenting the behavior of the primary diagnostic helper. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@128901 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/AnalysisBasedWarnings.cpp')
-rw-r--r--lib/Sema/AnalysisBasedWarnings.cpp31
1 files changed, 18 insertions, 13 deletions
diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp
index a649ff067e..e482172ca3 100644
--- a/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/lib/Sema/AnalysisBasedWarnings.cpp
@@ -410,7 +410,12 @@ public:
};
}
-static void DiagnoseUninitializedUse(Sema &S, const VarDecl *VD,
+/// DiagnoseUninitializedUse -- Helper function for diagnosing uses of an
+/// uninitialized variable. This manages the different forms of diagnostic
+/// emitted for particular types of uses. Returns true if the use was diagnosed
+/// as a warning. If a pariticular use is one we omit warnings for, returns
+/// false.
+static bool DiagnoseUninitializedUse(Sema &S, const VarDecl *VD,
const Expr *E, bool isAlwaysUninit) {
bool isSelfInit = false;
@@ -432,7 +437,7 @@ static void DiagnoseUninitializedUse(Sema &S, const VarDecl *VD,
// variables initialized in this way?
if (const Expr *Initializer = VD->getInit()) {
if (DRE == Initializer->IgnoreParenImpCasts())
- return;
+ return false;
ContainsReference CR(S.Context, DRE);
CR.Visit(const_cast<Expr*>(Initializer));
@@ -464,16 +469,10 @@ static void DiagnoseUninitializedUse(Sema &S, const VarDecl *VD,
S.Diag(VD->getLocStart(), diag::note_uninit_var_def)
<< VD->getDeclName();
+ return true;
}
-static void SuggestInitializationFixit(Sema &S, const VarDecl *VD,
- bool &fixitIssued) {
- // Only report the fixit once.
- if (fixitIssued)
- return;
-
- fixitIssued = true;
-
+static void SuggestInitializationFixit(Sema &S, const VarDecl *VD) {
// Don't issue a fixit if there is already an initializer.
if (VD->getInit())
return;
@@ -557,9 +556,15 @@ public:
for (UsesVec::iterator vi = vec->begin(), ve = vec->end(); vi != ve;
++vi) {
- DiagnoseUninitializedUse(S, vd, vi->first,
- /*isAlwaysUninit=*/vi->second);
- SuggestInitializationFixit(S, vd, fixitIssued);
+ if (!DiagnoseUninitializedUse(S, vd, vi->first,
+ /*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;
+ }
}
delete vec;