diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2011-04-05 18:27:05 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2011-04-05 18:27:05 +0000 |
commit | 262d50e1dcf529317da193ad585c11c16281a7ac (patch) | |
tree | 6cef447af7143cadf1940f5dc69362fbb45cb613 /lib/Sema/AnalysisBasedWarnings.cpp | |
parent | 64fb959beb3a0ecb84a58e6ff82660a7a669f7b8 (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.cpp | 31 |
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; |