- Add support for fuzzy parsing line-oriented __asm's (yuck).

- Change handling of __w64 to a built-in macro.

llvm-svn: 46864
This commit is contained in:
Steve Naroff 2008-02-07 23:24:32 +00:00
parent eef348687e
commit 4e79d340bd
4 changed files with 19 additions and 9 deletions

View File

@ -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");

View File

@ -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

View File

@ -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();
}

View File

@ -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