From: Steve Naroff Date: Thu, 7 Feb 2008 23:24:32 +0000 (+0000) Subject: - Add support for fuzzy parsing line-oriented __asm's (yuck). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b746ce84fb5c3fd2c5659f84dc6f2a883b499dc2;p=clang - Add support for fuzzy parsing line-oriented __asm's (yuck). - Change handling of __w64 to a built-in macro. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46864 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Lex/Preprocessor.cpp b/Lex/Preprocessor.cpp index 2fe08c6715..141536a1be 100644 --- a/Lex/Preprocessor.cpp +++ b/Lex/Preprocessor.cpp @@ -429,6 +429,7 @@ static void InitializePredefinedMacros(Preprocessor &PP, DefineBuiltinMacro(Buf, "__cdecl="); DefineBuiltinMacro(Buf, "_cdecl="); DefineBuiltinMacro(Buf, "__ptr64="); + DefineBuiltinMacro(Buf, "__w64="); DefineBuiltinMacro(Buf, "__forceinline="); DefineBuiltinMacro(Buf, "__int8=char"); DefineBuiltinMacro(Buf, "__int16=short"); diff --git a/Parse/ParseDecl.cpp b/Parse/ParseDecl.cpp index 2fc4d0de21..368887298e 100644 --- a/Parse/ParseDecl.cpp +++ b/Parse/ParseDecl.cpp @@ -483,8 +483,6 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS) { case tok::kw_typedef: isInvalid = DS.SetStorageClassSpec(DeclSpec::SCS_typedef, Loc, PrevSpec); break; - case tok::kw___w64: // ignore Microsoft specifier - break; case tok::kw___declspec: FuzzyParseMicrosoftDeclspec(); // Don't consume the next token, __declspec's can appear one after diff --git a/Parse/ParseStmt.cpp b/Parse/ParseStmt.cpp index 052aa1a8ee..7da47e84f2 100644 --- a/Parse/ParseStmt.cpp +++ b/Parse/ParseStmt.cpp @@ -14,6 +14,7 @@ #include "clang/Parse/Parser.h" #include "clang/Basic/Diagnostic.h" +#include "clang/Basic/SourceManager.h" #include "clang/Parse/DeclSpec.h" #include "clang/Parse/Scope.h" using namespace clang; @@ -911,10 +912,21 @@ Parser::StmtResult Parser::ParseReturnStatement() { } Parser::StmtResult Parser::FuzzyParseMicrosoftAsmStatement() { - unsigned short savedBraceCount = BraceCount; - do { - ConsumeAnyToken(); - } while (BraceCount > savedBraceCount && Tok.isNot(tok::eof)); + if (Tok.is(tok::l_brace)) { + unsigned short savedBraceCount = BraceCount; + do { + ConsumeAnyToken(); + } while (BraceCount > savedBraceCount && Tok.isNot(tok::eof)); + } else { + // From the MS website: If used without braces, the __asm keyword means + // that the rest of the line is an assembly-language statement. + SourceManager &SrcMgr = PP.getSourceManager(); + unsigned lineNo = SrcMgr.getLineNumber(Tok.getLocation()); + do { + ConsumeAnyToken(); + } while ((SrcMgr.getLineNumber(Tok.getLocation()) == lineNo) && + Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)); + } return false; } @@ -937,7 +949,7 @@ Parser::StmtResult Parser::ParseAsmStatement(bool &msAsm) { assert(Tok.is(tok::kw_asm) && "Not an asm stmt"); SourceLocation AsmLoc = ConsumeToken(); - if (Tok.is(tok::l_brace)) { + if (getLang().Microsoft && Tok.isNot(tok::l_paren)) { msAsm = true; return FuzzyParseMicrosoftAsmStatement(); } diff --git a/include/clang/Basic/TokenKinds.def b/include/clang/Basic/TokenKinds.def index f747da11e4..d2fe914f82 100644 --- a/include/clang/Basic/TokenKinds.def +++ b/include/clang/Basic/TokenKinds.def @@ -299,8 +299,7 @@ KEYWORD(__thread , EXTC90|EXTC99|EXTCPP|EXTCPP0x) // Apple Extension. KEYWORD(__private_extern__ , EXTC90|EXTC99|NOTCPP) -// Microsoft Extensions. -KEYWORD(__w64 , EXTC90|EXTC99|NOTCPP) +// Microsoft Extension. KEYWORD(__declspec , EXTC90|EXTC99|NOTCPP) // Alternate spelling for various tokens. There are GCC extensions in all