]> granicus.if.org Git - clang/commitdiff
Fix PR9741. The implicit declarations created for range-based for loops weren't being...
authorRichard Smith <richard-llvm@metafoo.co.uk>
Mon, 18 Apr 2011 15:49:25 +0000 (15:49 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Mon, 18 Apr 2011 15:49:25 +0000 (15:49 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129700 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/CFG.cpp
lib/Sema/SemaStmt.cpp
test/Analysis/PR9741.cpp [new file with mode: 0644]

index bfe2247fba1308682fc3d8ef206a1f447ec641be..eaab487d9592bf8ecbbcbf977f94f422471a6179 100644 (file)
@@ -2629,8 +2629,8 @@ CFGBlock* CFGBuilder::VisitCXXForRangeStmt(CXXForRangeStmt* S) {
 
   // Add the initialization statements.
   Block = createBlock();
-  addStmt(S->getRangeStmt());
-  return addStmt(S->getBeginEndStmt());
+  addStmt(S->getBeginEndStmt());
+  return addStmt(S->getRangeStmt());
 }
 
 CFGBlock *CFGBuilder::VisitExprWithCleanups(ExprWithCleanups *E,
index 407618219fbf322aaf15e799345ed40cdf7084bb..e6609c08e21e873880e3f8710b179a8afd85dbb2 100644 (file)
@@ -1029,6 +1029,7 @@ static VarDecl *BuildForRangeVarDecl(Sema &SemaRef, SourceLocation Loc,
   TypeSourceInfo *TInfo = SemaRef.Context.getTrivialTypeSourceInfo(Type, Loc);
   VarDecl *Decl = VarDecl::Create(SemaRef.Context, DC, Loc, Loc, II, Type,
                                   TInfo, SC_Auto, SC_None);
+  Decl->setImplicit();
   return Decl;
 }
 
@@ -1052,6 +1053,7 @@ static bool FinishForRangeVarDecl(Sema &SemaRef, VarDecl *Decl, Expr *Init,
   SemaRef.AddInitializerToDecl(Decl, Init, /*DirectInit=*/false,
                                /*TypeMayContainAuto=*/false);
   SemaRef.FinalizeDeclaration(Decl);
+  SemaRef.CurContext->addHiddenDecl(Decl);
   return false;
 }
 
diff --git a/test/Analysis/PR9741.cpp b/test/Analysis/PR9741.cpp
new file mode 100644 (file)
index 0000000..e20e56c
--- /dev/null
@@ -0,0 +1,8 @@
+// RUN: %clang_cc1 -cc1 -std=c++0x -Wuninitialized -verify %s
+
+void f() {
+  int a[] = { 1, 2, 3 };
+  unsigned int u = 0;
+  for (auto x : a)
+    ;
+}