diff options
author | Daniel Dunbar <daniel@zuster.org> | 2008-08-05 01:35:17 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2008-08-05 01:35:17 +0000 |
commit | a80f8749f2968d19595ca2544114932bf0ca2c11 (patch) | |
tree | fb1a27a8795fa3ac5c6b965cf38d1be74bfe49dc /lib/Parse | |
parent | 820b03398fdcc8f1f6c60ace55b708e311fa8ce4 (diff) |
Add more Parser/Sema support for GCC asm-label extension.
- ActOnDeclarator now takes an additional parameter which is the
AsmLabel if used. Its unfortunate that this bubbles up this high,
but we cannot just lump it in as an attribute without mistakenly
*accepting* it as an attribute.
- The actual asm-label itself is, however, encoded as an AsmLabelAttr
on the FunctionDecl.
- Slightly improved parser error recovery on malformed asm-labels.
- CodeGen support still missing...
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54339 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse')
-rw-r--r-- | lib/Parse/MinimalAction.cpp | 3 | ||||
-rw-r--r-- | lib/Parse/ParseDecl.cpp | 16 | ||||
-rw-r--r-- | lib/Parse/ParseObjc.cpp | 2 | ||||
-rw-r--r-- | lib/Parse/Parser.cpp | 6 |
4 files changed, 19 insertions, 8 deletions
diff --git a/lib/Parse/MinimalAction.cpp b/lib/Parse/MinimalAction.cpp index cb130c3d26..352925535d 100644 --- a/lib/Parse/MinimalAction.cpp +++ b/lib/Parse/MinimalAction.cpp @@ -63,7 +63,8 @@ MinimalAction::isTypeName(const IdentifierInfo &II, Scope *S) { /// IdentifierInfo::FETokenInfo field to keep track of this fact, until S is /// popped. Action::DeclTy * -MinimalAction::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *LastInGroup) { +MinimalAction::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *LastInGroup, + ExprTy *AsmLabel) { IdentifierInfo *II = D.getIdentifier(); // If there is no identifier associated with this declarator, bail out. diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 81cb0ce627..33482c5700 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -256,8 +256,14 @@ ParseInitDeclaratorListAfterFirstDeclarator(Declarator &D) { // rest of the init-declarator-list. while (1) { // If a simple-asm-expr is present, parse it. - if (Tok.is(tok::kw_asm)) - ParseSimpleAsm(); + ExprResult AsmLabel; + if (Tok.is(tok::kw_asm)) { + AsmLabel = ParseSimpleAsm(); + if (AsmLabel.isInvalid) { + SkipUntil(tok::semi); + return 0; + } + } // If attributes are present, parse them. if (Tok.is(tok::kw___attribute)) @@ -265,13 +271,13 @@ ParseInitDeclaratorListAfterFirstDeclarator(Declarator &D) { // Inform the current actions module that we just parsed this declarator. // FIXME: pass asm & attributes. - LastDeclInGroup = Actions.ActOnDeclarator(CurScope, D, LastDeclInGroup); + LastDeclInGroup = Actions.ActOnDeclarator(CurScope, D, LastDeclInGroup, + AsmLabel.Val); // Parse declarator '=' initializer. - ExprResult Init; if (Tok.is(tok::equal)) { ConsumeToken(); - Init = ParseInitializer(); + ExprResult Init = ParseInitializer(); if (Init.isInvalid) { SkipUntil(tok::semi); return 0; diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index 980105a02c..467cbd84a0 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -1222,7 +1222,7 @@ Parser::StmtResult Parser::ParseObjCTryStmt(SourceLocation atLoc) { ParseDeclarator(DeclaratorInfo); if (DeclaratorInfo.getIdentifier()) { DeclTy *aBlockVarDecl = Actions.ActOnDeclarator(CurScope, - DeclaratorInfo, 0); + DeclaratorInfo, 0, 0); StmtResult stmtResult = Actions.ActOnDeclStmt(aBlockVarDecl, DS.getSourceRange().getBegin(), diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp index ef07d3f08b..9eab4fda15 100644 --- a/lib/Parse/Parser.cpp +++ b/lib/Parse/Parser.cpp @@ -670,7 +670,11 @@ Parser::ExprResult Parser::ParseSimpleAsm() { ExprResult Result = ParseAsmStringLiteral(); - MatchRHSPunctuation(tok::r_paren, Loc); + if (Result.isInvalid) { + SkipUntil(tok::r_paren); + } else { + MatchRHSPunctuation(tok::r_paren, Loc); + } return Result; } |