Fix <rdar://problem/6451399> problems with labels and blocks.

- Move the 'LabelMap' from Sema to Scope. To avoid layering problems, the second element is now a 'StmtTy *', which makes the LabelMap a bit more verbose to deal with.
- Add 'ActiveScope' to Sema. Managed by ActOnStartOfFunctionDef(), ObjCActOnStartOfMethodDef(), ActOnBlockStmtExpr().
- Changed ActOnLabelStmt(), ActOnGotoStmt(), ActOnAddrLabel(), and ActOnFinishFunctionBody() to use the new ActiveScope.
- Added FIXME to workaround in ActOnFinishFunctionBody() (for dealing with C++ nested functions).  


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65694 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 8604670..e34a22e 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -4204,13 +4204,20 @@
                                       SourceLocation LabLoc,
                                       IdentifierInfo *LabelII) {
   // Look up the record for this label identifier.
-  LabelStmt *&LabelDecl = LabelMap[LabelII];
+  llvm::DenseMap<IdentifierInfo*, Action::StmtTy*>::iterator I = 
+    ActiveScope->LabelMap.find(LabelII);
 
+  LabelStmt *LabelDecl;
+  
   // If we haven't seen this label yet, create a forward reference. It
   // will be validated and/or cleaned up in ActOnFinishFunctionBody.
-  if (LabelDecl == 0)
+  if (I == ActiveScope->LabelMap.end()) {
     LabelDecl = new (Context) LabelStmt(LabLoc, LabelII, 0);
 
+    ActiveScope->LabelMap.insert(std::make_pair(LabelII, LabelDecl));
+  } else
+    LabelDecl = static_cast<LabelStmt *>(I->second);
+    
   // Create the AST node.  The address of a label always has type 'void*'.
   return new (Context) AddrLabelExpr(OpLoc, LabLoc, LabelDecl,
                                      Context.getPointerType(Context.VoidTy));
@@ -4397,7 +4404,9 @@
 
   // Add BSI to CurBlock.
   BSI->PrevBlockInfo = CurBlock;
+  BSI->PrevFunctionScope = ActiveScope;
   CurBlock = BSI;
+  ActiveScope = BlockScope;
 
   BSI->ReturnType = 0;
   BSI->TheScope = BlockScope;
@@ -4492,6 +4501,8 @@
 
   PopDeclContext();
 
+  ActiveScope = CurBlock->PrevFunctionScope;
+    
   // Pop off CurBlock, handle nested blocks.
   CurBlock = CurBlock->PrevBlockInfo;