Add initial prototype for implementation of
-Wuninitialized based on CFG dataflow analysis. WIP.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123512 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp
index 20a503d..14d7533 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 @@
}
//===----------------------------------------------------------------------===//
+// -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 @@
// 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::