From: Steve Naroff Date: Mon, 11 Feb 2008 23:15:56 +0000 (+0000) Subject: Several cleanups surrounding Parser::ParseAsmStatement() and Parser::FuzzyParseMicros... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5f8aa696619e32bf307232841fedb704ba733b4d;p=clang Several cleanups surrounding Parser::ParseAsmStatement() and Parser::FuzzyParseMicrosoftAsmStatement(). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46977 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Parse/ParseDecl.cpp b/Parse/ParseDecl.cpp index ea12a7c120..3b6e04d84f 100644 --- a/Parse/ParseDecl.cpp +++ b/Parse/ParseDecl.cpp @@ -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 { diff --git a/Parse/ParseStmt.cpp b/Parse/ParseStmt.cpp index db91f0dec7..389d5d4a54 100644 --- a/Parse/ParseStmt.cpp +++ b/Parse/ParseStmt.cpp @@ -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(); } diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h index 907d7ac3ea..a12f52cb4a 100644 --- a/include/clang/Parse/Parser.h +++ b/include/clang/Parse/Parser.h @@ -439,6 +439,7 @@ private: bool isDeclarationSpecifier() const; bool isTypeSpecifierQualifier() const; + bool isTypeQualifier() const; TypeTy *ParseTypeName(); AttributeList *ParseAttributes();