summaryrefslogtreecommitdiffstats
path: root/clang/Parse/Parser.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2008-02-07 17:19:11 +0000
committerAnders Carlsson <andersca@mac.com>2008-02-07 17:19:11 +0000
commitbcc3a4bf6421de70637df58db8b9d0fc72154ef9 (patch)
tree2019d7aef2eea31995ec557044b67a358c7d878a /clang/Parse/Parser.cpp
parent63a8452e9ce57568b502808dc0e59209d7e71b54 (diff)
downloadbcm5719-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.cpp22
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);
}
OpenPOWER on IntegriCloud