diff options
author | Chris Lattner <sabre@nondot.org> | 2011-02-17 07:39:24 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2011-02-17 07:39:24 +0000 |
commit | ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298 (patch) | |
tree | d937c0c2c2c7d6a5a9ed8efbd45903e4314cba94 /lib/AST | |
parent | 1aa3d81c6e63959ef149489eca42b1520c521af4 (diff) |
Step #1/N of implementing support for __label__: split labels into
LabelDecl and LabelStmt. There is a 1-1 correspondence between the
two, but this simplifies a bunch of code by itself. This is because
labels are the only place where we previously had references to random
other statements, causing grief for AST serialization and other stuff.
This does cause one regression (attr(unused) doesn't silence unused
label warnings) which I'll address next.
This does fix some minor bugs:
1. "The only valid attribute " diagnostic was capitalized.
2. Various diagnostics printed as ''labelname'' instead of 'labelname'
3. This reduces duplication of label checking between functions and blocks.
Review appreciated, particularly for the cindex and template bits.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125733 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST')
-rw-r--r-- | lib/AST/Decl.cpp | 6 | ||||
-rw-r--r-- | lib/AST/DeclBase.cpp | 3 | ||||
-rw-r--r-- | lib/AST/Stmt.cpp | 4 | ||||
-rw-r--r-- | lib/AST/StmtProfile.cpp | 6 |
4 files changed, 13 insertions, 6 deletions
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index fded8ff38c..441444da9e 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -2182,6 +2182,12 @@ TranslationUnitDecl *TranslationUnitDecl::Create(ASTContext &C) { return new (C) TranslationUnitDecl(C); } +LabelDecl *LabelDecl::Create(ASTContext &C, DeclContext *DC, + SourceLocation L, IdentifierInfo *II) { + return new (C) LabelDecl(DC, L, II, 0); +} + + NamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id) { return new (C) NamespaceDecl(DC, L, Id); diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index 110de64d8c..dfc5a6ae5d 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -269,7 +269,8 @@ unsigned Decl::getIdentifierNamespaceForKind(Kind DeclKind) { case ObjCMethod: case ObjCProperty: return IDNS_Ordinary; - + case Label: + return IDNS_Label; case IndirectField: return IDNS_Ordinary | IDNS_Member; diff --git a/lib/AST/Stmt.cpp b/lib/AST/Stmt.cpp index 66182957d6..7e73f02e67 100644 --- a/lib/AST/Stmt.cpp +++ b/lib/AST/Stmt.cpp @@ -161,7 +161,7 @@ void CompoundStmt::setStmts(ASTContext &C, Stmt **Stmts, unsigned NumStmts) { } const char *LabelStmt::getName() const { - return getID()->getNameStart(); + return getDecl()->getIdentifier()->getNameStart(); } // This is defined here to avoid polluting Stmt.h with importing Expr.h @@ -658,7 +658,7 @@ void WhileStmt::setConditionVariable(ASTContext &C, VarDecl *V) { } // IndirectGotoStmt -LabelStmt *IndirectGotoStmt::getConstantTarget() { +LabelDecl *IndirectGotoStmt::getConstantTarget() { if (AddrLabelExpr *E = dyn_cast<AddrLabelExpr>(getTarget()->IgnoreParenImpCasts())) return E->getLabel(); diff --git a/lib/AST/StmtProfile.cpp b/lib/AST/StmtProfile.cpp index b96ffe8a48..2ffb807abc 100644 --- a/lib/AST/StmtProfile.cpp +++ b/lib/AST/StmtProfile.cpp @@ -101,7 +101,7 @@ void StmtProfiler::VisitDefaultStmt(DefaultStmt *S) { void StmtProfiler::VisitLabelStmt(LabelStmt *S) { VisitStmt(S); - VisitName(S->getID()); + VisitDecl(S->getDecl()); } void StmtProfiler::VisitIfStmt(IfStmt *S) { @@ -129,7 +129,7 @@ void StmtProfiler::VisitForStmt(ForStmt *S) { void StmtProfiler::VisitGotoStmt(GotoStmt *S) { VisitStmt(S); - VisitName(S->getLabel()->getID()); + VisitDecl(S->getLabel()); } void StmtProfiler::VisitIndirectGotoStmt(IndirectGotoStmt *S) { @@ -351,7 +351,7 @@ void StmtProfiler::VisitConditionalOperator(ConditionalOperator *S) { void StmtProfiler::VisitAddrLabelExpr(AddrLabelExpr *S) { VisitExpr(S); - VisitName(S->getLabel()->getID()); + VisitDecl(S->getLabel()); } void StmtProfiler::VisitStmtExpr(StmtExpr *S) { |