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::