diff options
Diffstat (limited to 'lib/Sema/AnalysisBasedWarnings.cpp')
-rw-r--r-- | lib/Sema/AnalysisBasedWarnings.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp index 20a503d6a5..14d75338e0 100644 --- a/lib/Sema/AnalysisBasedWarnings.cpp +++ b/lib/Sema/AnalysisBasedWarnings.cpp @@ -25,6 +25,7 @@ #include "clang/Analysis/AnalysisContext.h" #include "clang/Analysis/CFG.h" #include "clang/Analysis/Analyses/ReachableCode.h" +#include "clang/Analysis/Analyses/UninitializedValuesV2.h" #include "llvm/ADT/BitVector.h" #include "llvm/Support/Casting.h" @@ -344,6 +345,23 @@ static void CheckFallThroughForBody(Sema &S, const Decl *D, const Stmt *Body, } //===----------------------------------------------------------------------===// +// -Wuninitialized +//===----------------------------------------------------------------------===// + +namespace { +class UninitValsDiagReporter : public UninitVariablesHandler { + Sema &S; +public: + UninitValsDiagReporter(Sema &S) : S(S) {} + + void handleUseOfUninitVariable(const DeclRefExpr *dr, const VarDecl *vd) { + S.Diag(dr->getLocStart(), diag::warn_var_is_uninit) + << vd->getDeclName() << dr->getSourceRange(); + } +}; +} + +//===----------------------------------------------------------------------===// // AnalysisBasedWarnings - Worker object used by Sema to execute analysis-based // warnings on a function, method, or block. //===----------------------------------------------------------------------===// @@ -406,6 +424,18 @@ AnalysisBasedWarnings::IssueWarnings(sema::AnalysisBasedWarnings::Policy P, // Warning: check for unreachable code if (P.enableCheckUnreachable) CheckUnreachable(S, AC); + + if (Diags.getDiagnosticLevel(diag::warn_var_is_uninit, D->getLocStart()) + != Diagnostic::Ignored) { + if (!S.getLangOptions().CPlusPlus) { + CFG *cfg = AC.getCFG(); + if (cfg) { + UninitValsDiagReporter reporter(S); + runUninitializedVariablesAnalysis(*cast<DeclContext>(D), *cfg, + reporter); + } + } + } } void clang::sema:: |