Several cleanups surrounding Parser::ParseAsmStatement() and Parser::FuzzyParseMicrosoftAsmStatement().

llvm-svn: 46977
This commit is contained in:
Steve Naroff 2008-02-11 23:15:56 +00:00
parent 633654ffab
commit 69e8f9efab
3 changed files with 30 additions and 2 deletions

View File

@ -871,6 +871,19 @@ void Parser::ParseEnumBody(SourceLocation StartLoc, DeclTy *EnumDecl) {
AttrList = ParseAttributes(); // FIXME: where do they do?
}
/// isTypeSpecifierQualifier - Return true if the current token could be the
/// start of a type-qualifier-list.
bool Parser::isTypeQualifier() const {
switch (Tok.getKind()) {
default: return false;
// type-qualifier
case tok::kw_const:
case tok::kw_volatile:
case tok::kw_restrict:
return true;
}
}
/// isTypeSpecifierQualifier - Return true if the current token could be the
/// start of a specifier-qualifier-list.
bool Parser::isTypeSpecifierQualifier() const {

View File

@ -911,6 +911,8 @@ Parser::StmtResult Parser::ParseReturnStatement() {
return Actions.ActOnReturnStmt(ReturnLoc, R.Val);
}
/// FuzzyParseMicrosoftAsmStatement. When -fms-extensions is enabled, this
/// routine is called to skip/ignore tokens that comprise the MS asm statement.
Parser::StmtResult Parser::FuzzyParseMicrosoftAsmStatement() {
if (Tok.is(tok::l_brace)) {
unsigned short savedBraceCount = BraceCount;
@ -934,7 +936,11 @@ Parser::StmtResult Parser::FuzzyParseMicrosoftAsmStatement() {
}
/// ParseAsmStatement - Parse a GNU extended asm statement.
/// [GNU] asm-statement:
/// asm-statement:
/// gnu-asm-statement
/// ms-asm-statement
///
/// [GNU] gnu-asm-statement:
/// 'asm' type-qualifier[opt] '(' asm-argument ')' ';'
///
/// [GNU] asm-argument:
@ -948,11 +954,19 @@ Parser::StmtResult Parser::FuzzyParseMicrosoftAsmStatement() {
/// asm-string-literal
/// asm-clobbers ',' asm-string-literal
///
/// [MS] ms-asm-statement:
/// '__asm' assembly-instruction ';'[opt]
/// '__asm' '{' assembly-instruction-list '}' ';'[opt]
///
/// [MS] assembly-instruction-list:
/// assembly-instruction ';'[opt]
/// assembly-instruction-list ';' assembly-instruction ';'[opt]
///
Parser::StmtResult Parser::ParseAsmStatement(bool &msAsm) {
assert(Tok.is(tok::kw_asm) && "Not an asm stmt");
SourceLocation AsmLoc = ConsumeToken();
if (getLang().Microsoft && Tok.isNot(tok::l_paren)) {
if (getLang().Microsoft && Tok.isNot(tok::l_paren) && !isTypeQualifier()) {
msAsm = true;
return FuzzyParseMicrosoftAsmStatement();
}

View File

@ -439,6 +439,7 @@ private:
bool isDeclarationSpecifier() const;
bool isTypeSpecifierQualifier() const;
bool isTypeQualifier() const;
TypeTy *ParseTypeName();
AttributeList *ParseAttributes();