diff options
author | Steve Naroff <snaroff@apple.com> | 2009-03-13 15:38:40 +0000 |
---|---|---|
committer | Steve Naroff <snaroff@apple.com> | 2009-03-13 15:38:40 +0000 |
commit | caaacecb2b64e6d2e402533baffda4cb540f4145 (patch) | |
tree | e7a2837c8d3b6aa2df6b1ecaa00f2f809e0c64f5 | |
parent | 610e81d6b7248ce4be4be2252b03a5d4052c9835 (diff) |
Remove ActiveScope (revert http://llvm.org/viewvc/llvm-project?view=rev&revision=65694 and http://llvm.org/viewvc/llvm-project?view=rev&revision=66741).
Will replace with something better today...
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66893 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Parse/Scope.h | 8 | ||||
-rw-r--r-- | lib/Sema/Sema.cpp | 2 | ||||
-rw-r--r-- | lib/Sema/Sema.h | 9 | ||||
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 27 | ||||
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 2 | ||||
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 26 | ||||
-rw-r--r-- | lib/Sema/SemaStmt.cpp | 24 | ||||
-rw-r--r-- | test/Sema/block-labels.c | 17 |
8 files changed, 19 insertions, 96 deletions
diff --git a/include/clang/Parse/Scope.h b/include/clang/Parse/Scope.h index 84bca924f4..2efb809bbc 100644 --- a/include/clang/Parse/Scope.h +++ b/include/clang/Parse/Scope.h @@ -16,7 +16,6 @@ #include "clang/Parse/Action.h" #include "llvm/ADT/SmallPtrSet.h" -#include "llvm/ADT/DenseSet.h" namespace clang { @@ -131,12 +130,6 @@ private: UsingDirectivesTy UsingDirectives; public: - /// LabelMap - This is a mapping from label identifiers to the LabelStmt for - /// it (which acts like the label decl in some ways). Forward referenced - /// labels have a LabelStmt created for them with a null location & SubStmt. - typedef llvm::DenseMap<IdentifierInfo*, Action::StmtTy*> LabelMapTy; - LabelMapTy LabelMap; - Scope(Scope *Parent, unsigned ScopeFlags) { Init(Parent, ScopeFlags); } @@ -308,7 +301,6 @@ public: if (Flags & TemplateParamScope) TemplateParamParent = this; DeclsInScope.clear(); UsingDirectives.clear(); - LabelMap.clear(); Entity = 0; } }; diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp index d8610133f2..992d3ecbee 100644 --- a/lib/Sema/Sema.cpp +++ b/lib/Sema/Sema.cpp @@ -169,8 +169,6 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer) StdNamespace = 0; TUScope = 0; - ActiveScope = 0; - if (getLangOptions().CPlusPlus) FieldCollector.reset(new CXXFieldCollector()); diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index fbae644568..b403a8ba1d 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -104,14 +104,15 @@ public: /// the active block object that represents it. BlockSemaInfo *CurBlock; - /// ActiveScope - If inside of a function, method, or block definition, - /// this contains a pointer to the active scope that represents it. - Scope *ActiveScope; - /// PackContext - Manages the stack for #pragma pack. An alignment /// of 0 indicates default alignment. void *PackContext; // Really a "PragmaPackStack*" + /// LabelMap - This is a mapping from label identifiers to the LabelStmt for + /// it (which acts like the label decl in some ways). Forward referenced + /// labels have a LabelStmt created for them with a null location & SubStmt. + llvm::DenseMap<IdentifierInfo*, LabelStmt*> LabelMap; + llvm::SmallVector<SwitchStmt*, 8> SwitchStack; /// ExtVectorDecls - This is a list all the extended vector types. This allows diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index f3983aee45..51b2b853a8 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -2631,8 +2631,6 @@ Sema::DeclTy *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, DeclTy *D) { Decl *decl = static_cast<Decl*>(D); FunctionDecl *FD = cast<FunctionDecl>(decl); - ActiveScope = FnBodyScope; - // See if this is a redefinition. const FunctionDecl *Definition; if (FD->getBody(Definition)) { @@ -2784,29 +2782,17 @@ Sema::DeclTy *Sema::ActOnFinishFunctionBody(DeclTy *D, StmtArg BodyArg) { return 0; } PopDeclContext(); - - // FIXME: Temporary hack to workaround nested C++ functions. For example: - // class C2 { - // void f() { - // class LC1 { - // int m() { return 1; } - // }; - // } - // }; - if (ActiveScope == 0) - return D; - // Verify and clean out per-function state. - bool HaveLabels = !ActiveScope->LabelMap.empty(); + bool HaveLabels = !LabelMap.empty(); // Check goto/label use. - for (Scope::LabelMapTy::iterator I = ActiveScope->LabelMap.begin(), - E = ActiveScope->LabelMap.end(); I != E; ++I) { + for (llvm::DenseMap<IdentifierInfo*, LabelStmt*>::iterator + I = LabelMap.begin(), E = LabelMap.end(); I != E; ++I) { // Verify that we have no forward references left. If so, there was a goto // or address of a label taken, but no definition of it. Label fwd // definitions are indicated with a null substmt. - LabelStmt *L = static_cast<LabelStmt*>(I->second); - if (L->getSubStmt() == 0) { + if (I->second->getSubStmt() == 0) { + LabelStmt *L = I->second; // Emit error. Diag(L->getIdentLoc(), diag::err_undeclared_label_use) << L->getName(); @@ -2828,8 +2814,7 @@ Sema::DeclTy *Sema::ActOnFinishFunctionBody(DeclTy *D, StmtArg BodyArg) { } } } - // This reset is for both functions and methods. - ActiveScope = 0; + LabelMap.clear(); if (!Body) return D; diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 476b6afea5..6ca64e388e 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -37,8 +37,6 @@ void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, DeclTy *D) { // Allow all of Sema to see that we are entering a method definition. PushDeclContext(FnBodyScope, MDecl); - ActiveScope = FnBodyScope; - // Create Decl objects for each parameter, entrring them in the scope for // binding to their use. diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 3f8eb72a6c..9f915fc7f9 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -4336,20 +4336,13 @@ Sema::ExprResult Sema::ActOnAddrLabel(SourceLocation OpLoc, SourceLocation LabLoc, IdentifierInfo *LabelII) { // Look up the record for this label identifier. - llvm::DenseMap<IdentifierInfo*, Action::StmtTy*>::iterator I = - ActiveScope->LabelMap.find(LabelII); + LabelStmt *&LabelDecl = LabelMap[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 (I == ActiveScope->LabelMap.end()) { + if (LabelDecl == 0) 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)); @@ -4539,7 +4532,6 @@ void Sema::ActOnBlockStart(SourceLocation CaretLoc, Scope *BlockScope) { // Add BSI to CurBlock. BSI->PrevBlockInfo = CurBlock; CurBlock = BSI; - ActiveScope = BlockScope; BSI->ReturnType = 0; BSI->TheScope = BlockScope; @@ -4617,13 +4609,6 @@ void Sema::ActOnBlockError(SourceLocation CaretLoc, Scope *CurScope) { // Ensure that CurBlock is deleted. llvm::OwningPtr<BlockSemaInfo> CC(CurBlock); - // Before popping CurBlock, set ActiveScope to this scope's function - // or block parent. - ActiveScope = CurBlock->TheScope->getParent(); - while (ActiveScope && - ((ActiveScope->getFlags() & (Scope::FnScope | Scope::BlockScope)) == 0)) - ActiveScope = ActiveScope->getParent(); - // Pop off CurBlock, handle nested blocks. CurBlock = CurBlock->PrevBlockInfo; @@ -4641,13 +4626,6 @@ Sema::ExprResult Sema::ActOnBlockStmtExpr(SourceLocation CaretLoc, StmtTy *body, PopDeclContext(); - // Before popping CurBlock, set ActiveScope to this scope's function - // or block parent. - ActiveScope = CurBlock->TheScope->getParent(); - while (ActiveScope && - ((ActiveScope->getFlags() & (Scope::FnScope | Scope::BlockScope)) == 0)) - ActiveScope = ActiveScope->getParent(); - // Pop off CurBlock, handle nested blocks. CurBlock = CurBlock->PrevBlockInfo; diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index 32d295772c..f8e225540b 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -169,19 +169,12 @@ Action::OwningStmtResult Sema::ActOnLabelStmt(SourceLocation IdentLoc, IdentifierInfo *II, SourceLocation ColonLoc, StmtArg subStmt) { Stmt *SubStmt = static_cast<Stmt*>(subStmt.release()); - // Look up the record for this label identifier. - Scope::LabelMapTy::iterator I = ActiveScope->LabelMap.find(II); + LabelStmt *&LabelDecl = LabelMap[II]; - LabelStmt *LabelDecl; - // If not forward referenced or defined already, just create a new LabelStmt. - if (I == ActiveScope->LabelMap.end()) { - LabelDecl = new (Context) LabelStmt(IdentLoc, II, SubStmt); - ActiveScope->LabelMap.insert(std::make_pair(II, LabelDecl)); - return Owned(LabelDecl); - } else - LabelDecl = static_cast<LabelStmt *>(I->second); + if (LabelDecl == 0) + return Owned(LabelDecl = new (Context) LabelStmt(IdentLoc, II, SubStmt)); assert(LabelDecl->getID() == II && "Label mismatch!"); @@ -683,16 +676,11 @@ Sema::ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, return StmtError(Diag(GotoLoc, diag::err_goto_in_block)); // Look up the record for this label identifier. - Scope::LabelMapTy::iterator I = ActiveScope->LabelMap.find(LabelII); + LabelStmt *&LabelDecl = LabelMap[LabelII]; - LabelStmt *LabelDecl; - - // If not forward referenced or defined already, just create a new LabelStmt. - if (I == ActiveScope->LabelMap.end()) { + // If we haven't seen this label yet, create a forward reference. + if (LabelDecl == 0) LabelDecl = new (Context) LabelStmt(LabelLoc, LabelII, 0); - ActiveScope->LabelMap.insert(std::make_pair(LabelII, LabelDecl)); - } else - LabelDecl = static_cast<LabelStmt *>(I->second); return Owned(new (Context) GotoStmt(LabelDecl, GotoLoc, LabelLoc)); } diff --git a/test/Sema/block-labels.c b/test/Sema/block-labels.c index 15e6f61ced..e69de29bb2 100644 --- a/test/Sema/block-labels.c +++ b/test/Sema/block-labels.c @@ -1,17 +0,0 @@ -// RUN: clang %s -verify -fblocks -fsyntax-only - -int a() { - A:if (1) xx(); - return ^{A:return 1;}(); -} -int b() { - A: return ^{int a; A:return 1;}(); -} - -int d() { - A: return ^{int a; A: a = ^{int a; A:return 1;}() + ^{int b; A:return 2;}(); return a; }(); -} - -int c() { - goto A; return ^{ A:return 1;}(); // expected-error {{use of undeclared label 'A'}} -} |