diff options
| author | Anders Carlsson <andersca@mac.com> | 2008-02-07 17:19:11 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2008-02-07 17:19:11 +0000 |
| commit | bcc3a4bf6421de70637df58db8b9d0fc72154ef9 (patch) | |
| tree | 2019d7aef2eea31995ec557044b67a358c7d878a /clang/Parse/Parser.cpp | |
| parent | 63a8452e9ce57568b502808dc0e59209d7e71b54 (diff) | |
| download | bcm5719-llvm-bcc3a4bf6421de70637df58db8b9d0fc72154ef9.tar.gz bcm5719-llvm-bcc3a4bf6421de70637df58db8b9d0fc72154ef9.zip | |
Handle top-level asm declarations.
llvm-svn: 46855
Diffstat (limited to 'clang/Parse/Parser.cpp')
| -rw-r--r-- | clang/Parse/Parser.cpp | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/clang/Parse/Parser.cpp b/clang/Parse/Parser.cpp index 6f2a71257a0..32856fe82b3 100644 --- a/clang/Parse/Parser.cpp +++ b/clang/Parse/Parser.cpp @@ -321,11 +321,7 @@ Parser::DeclTy *Parser::ParseExternalDeclaration() { return RV; } case tok::kw_asm: - ParseSimpleAsm(); - ExpectAndConsume(tok::semi, diag::err_expected_semi_after, - "top-level asm block"); - // TODO: Invoke action for top-level asm. - return 0; + return ParseSimpleAsm(); case tok::at: // @ is not a legal token unless objc is enabled, no need to check. return ParseObjCAtDirectives(); @@ -610,19 +606,25 @@ Parser::ExprResult Parser::ParseAsmStringLiteral() { /// [GNU] simple-asm-expr: /// 'asm' '(' asm-string-literal ')' /// -void Parser::ParseSimpleAsm() { +Parser::DeclTy *Parser::ParseSimpleAsm() { assert(Tok.is(tok::kw_asm) && "Not an asm!"); - ConsumeToken(); + SourceLocation Loc = ConsumeToken(); if (Tok.isNot(tok::l_paren)) { Diag(Tok, diag::err_expected_lparen_after, "asm"); - return; + return 0; } - SourceLocation Loc = ConsumeParen(); + ConsumeParen(); - ParseAsmStringLiteral(); + ExprResult Result = ParseAsmStringLiteral(); MatchRHSPunctuation(tok::r_paren, Loc); + + if (ExpectAndConsume(tok::semi, diag::err_expected_semi_after, + "top-level asm block")) + return 0; + + return Actions.ActOnFileScopeAsmDecl(Loc, Result.Val); } |

