Teach -Wuninitialized-experimental to also warn
about uninitialized variables captured by blocks.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124213 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp
index 38284f6..4866c8f 100644
--- a/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/lib/Sema/AnalysisBasedWarnings.cpp
@@ -366,7 +366,7 @@
 
 namespace {
 struct SLocSort {
-  bool operator()(const DeclRefExpr *a, const DeclRefExpr *b) {
+  bool operator()(const Expr *a, const Expr *b) {
     SourceLocation aLoc = a->getLocStart();
     SourceLocation bLoc = b->getLocStart();
     return aLoc.getRawEncoding() < bLoc.getRawEncoding();
@@ -375,7 +375,7 @@
 
 class UninitValsDiagReporter : public UninitVariablesHandler {
   Sema &S;
-  typedef llvm::SmallVector<const DeclRefExpr *, 2> UsesVec;
+  typedef llvm::SmallVector<const Expr *, 2> UsesVec;
   typedef llvm::DenseMap<const VarDecl *, UsesVec*> UsesMap;
   UsesMap *uses;
   
@@ -385,7 +385,7 @@
     flushDiagnostics();
   }
   
-  void handleUseOfUninitVariable(const DeclRefExpr *dr, const VarDecl *vd) {
+  void handleUseOfUninitVariable(const Expr *ex, const VarDecl *vd) {
     if (!uses)
       uses = new UsesMap();
     
@@ -393,7 +393,7 @@
     if (!vec)
       vec = new UsesVec();
     
-    vec->push_back(dr);    
+    vec->push_back(ex);
   }
   
   void flushDiagnostics() {
@@ -404,7 +404,7 @@
       const VarDecl *vd = i->first;
       UsesVec *vec = i->second;
       
-      S.Diag(vd->getLocStart(), diag::warn_var_is_uninit)
+      S.Diag(vd->getLocStart(), diag::warn_uninit_var)
         << vd->getDeclName() << vd->getSourceRange();
       
       // Sort the uses by their SourceLocations.  While not strictly
@@ -414,9 +414,15 @@
       
       for (UsesVec::iterator vi = vec->begin(), ve = vec->end(); vi != ve; ++vi)
       {
-        const DeclRefExpr *dr = *vi;
-        S.Diag(dr->getLocStart(), diag::note_var_is_uninit)
-          << vd->getDeclName() << dr->getSourceRange();
+        if (const DeclRefExpr *dr = dyn_cast<DeclRefExpr>(*vi)) {
+          S.Diag(dr->getLocStart(), diag::note_uninit_var)
+            << vd->getDeclName() << dr->getSourceRange();
+        }
+        else {
+          const BlockExpr *be = cast<BlockExpr>(*vi);
+          S.Diag(be->getLocStart(), diag::note_uninit_var_captured_by_block)
+            << vd->getDeclName();
+        }
       }
 
       // Suggest possible initialization (if any).
@@ -514,11 +520,12 @@
   if (P.enableCheckUnreachable)
     CheckUnreachable(S, AC);
   
-  if (Diags.getDiagnosticLevel(diag::warn_var_is_uninit, D->getLocStart())
+  if (Diags.getDiagnosticLevel(diag::warn_uninit_var, D->getLocStart())
       != Diagnostic::Ignored) {
     if (CFG *cfg = AC.getCFG()) {
       UninitValsDiagReporter reporter(S);
-      runUninitializedVariablesAnalysis(*cast<DeclContext>(D), *cfg, reporter);
+      runUninitializedVariablesAnalysis(*cast<DeclContext>(D), *cfg, AC,
+                                        reporter);
     }
   }
 }