diff options
author | Ted Kremenek <kremenek@apple.com> | 2011-03-15 04:57:38 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2011-03-15 04:57:38 +0000 |
commit | f7bafc77ba12bb1beb665243a0334cd81e024728 (patch) | |
tree | 4bf9cc9eeaec35174ac87fe3ee46df43d975aff9 /lib/Sema/AnalysisBasedWarnings.cpp | |
parent | 496398d523de712ac1084c53a397ca3987fe43db (diff) |
Split warnings from -Wuninitialized-experimental into "must-be-initialized" and "may-be-initialized" warnings, each controlled by different flags.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@127666 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/AnalysisBasedWarnings.cpp')
-rw-r--r-- | lib/Sema/AnalysisBasedWarnings.cpp | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp index 2da100ec82..e71f2dfb86 100644 --- a/lib/Sema/AnalysisBasedWarnings.cpp +++ b/lib/Sema/AnalysisBasedWarnings.cpp @@ -377,18 +377,20 @@ static void CheckFallThroughForBody(Sema &S, const Decl *D, const Stmt *Body, // -Wuninitialized //===----------------------------------------------------------------------===// +typedef std::pair<const Expr*, bool> UninitUse; + namespace { struct SLocSort { - bool operator()(const Expr *a, const Expr *b) { - SourceLocation aLoc = a->getLocStart(); - SourceLocation bLoc = b->getLocStart(); + bool operator()(const UninitUse &a, const UninitUse &b) { + SourceLocation aLoc = a.first->getLocStart(); + SourceLocation bLoc = b.first->getLocStart(); return aLoc.getRawEncoding() < bLoc.getRawEncoding(); } }; class UninitValsDiagReporter : public UninitVariablesHandler { Sema &S; - typedef llvm::SmallVector<const Expr *, 2> UsesVec; + typedef llvm::SmallVector<UninitUse, 2> UsesVec; typedef llvm::DenseMap<const VarDecl *, UsesVec*> UsesMap; UsesMap *uses; @@ -398,7 +400,8 @@ public: flushDiagnostics(); } - void handleUseOfUninitVariable(const Expr *ex, const VarDecl *vd) { + void handleUseOfUninitVariable(const Expr *ex, const VarDecl *vd, + bool isAlwaysUninit) { if (!uses) uses = new UsesMap(); @@ -406,7 +409,7 @@ public: if (!vec) vec = new UsesVec(); - vec->push_back(ex); + vec->push_back(std::make_pair(ex, isAlwaysUninit)); } void flushDiagnostics() { @@ -426,13 +429,18 @@ public: for (UsesVec::iterator vi = vec->begin(), ve = vec->end(); vi != ve; ++vi) { - if (const DeclRefExpr *dr = dyn_cast<DeclRefExpr>(*vi)) { - S.Diag(dr->getLocStart(), diag::warn_uninit_var) + const bool isAlwaysUninit = vi->second; + if (const DeclRefExpr *dr = dyn_cast<DeclRefExpr>(vi->first)) { + S.Diag(dr->getLocStart(), + isAlwaysUninit ? diag::warn_uninit_var + : diag::warn_maybe_uninit_var) << vd->getDeclName() << dr->getSourceRange(); } else { - const BlockExpr *be = cast<BlockExpr>(*vi); - S.Diag(be->getLocStart(), diag::warn_uninit_var_captured_by_block) + const BlockExpr *be = cast<BlockExpr>(vi->first); + S.Diag(be->getLocStart(), + isAlwaysUninit ? diag::warn_uninit_var_captured_by_block + : diag::warn_maybe_uninit_var_captured_by_block) << vd->getDeclName(); } |