diff options
-rw-r--r-- | include/clang/Basic/TokenKinds.def | 3 | ||||
-rw-r--r-- | lib/Lex/Preprocessor.cpp | 3 | ||||
-rw-r--r-- | lib/Parse/ParseDecl.cpp | 3 | ||||
-rw-r--r-- | test/Parser/MicrosoftExtensions.c | 15 |
4 files changed, 21 insertions, 3 deletions
diff --git a/include/clang/Basic/TokenKinds.def b/include/clang/Basic/TokenKinds.def index 686c1b5b2a..01a85c0a18 100644 --- a/include/clang/Basic/TokenKinds.def +++ b/include/clang/Basic/TokenKinds.def @@ -312,6 +312,9 @@ KEYWORD(__declspec , EXTC90|EXTC99|EXTCPP|EXTCPP0x) KEYWORD(__cdecl , EXTC90|EXTC99|EXTCPP|EXTCPP0x) KEYWORD(__stdcall , EXTC90|EXTC99|EXTCPP|EXTCPP0x) KEYWORD(__fastcall , EXTC90|EXTC99|EXTCPP|EXTCPP0x) +KEYWORD(__ptr64 , EXTC90|EXTC99|EXTCPP|EXTCPP0x) +KEYWORD(__w64 , EXTC90|EXTC99|EXTCPP|EXTCPP0x) +KEYWORD(__forceinline , EXTC90|EXTC99|EXTCPP|EXTCPP0x) // Alternate spelling for various tokens. There are GCC extensions in all // languages, but should not be disabled in strict conformance mode. diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index e68a44c188..aa2944f331 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -484,9 +484,6 @@ static void InitializePredefinedMacros(Preprocessor &PP, // mode. if (PP.getLangOptions().Microsoft) { DefineBuiltinMacro(Buf, "_cdecl=__cdecl"); - DefineBuiltinMacro(Buf, "__ptr64="); - DefineBuiltinMacro(Buf, "__w64="); - DefineBuiltinMacro(Buf, "__forceinline="); DefineBuiltinMacro(Buf, "__int8=char"); DefineBuiltinMacro(Buf, "__int16=short"); DefineBuiltinMacro(Buf, "__int32=int"); diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index bf75ab0e93..e3fd6961bf 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -561,6 +561,8 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS, continue; // Microsoft single token adornments. + case tok::kw___forceinline: + case tok::kw___w64: case tok::kw___cdecl: case tok::kw___stdcall: case tok::kw___fastcall: @@ -1322,6 +1324,7 @@ void Parser::ParseTypeQualifierListOpt(DeclSpec &DS, bool AttributesAllowed) { isInvalid = DS.SetTypeQual(DeclSpec::TQ_restrict, Loc, PrevSpec, getLang())*2; break; + case tok::kw___ptr64: case tok::kw___cdecl: case tok::kw___stdcall: case tok::kw___fastcall: diff --git a/test/Parser/MicrosoftExtensions.c b/test/Parser/MicrosoftExtensions.c index dc26c57323..0ff59f75aa 100644 --- a/test/Parser/MicrosoftExtensions.c +++ b/test/Parser/MicrosoftExtensions.c @@ -6,3 +6,18 @@ void (*__fastcall fastpfunc)(); extern __declspec(dllimport) void __stdcall VarR4FromDec(); __declspec(deprecated) __declspec(deprecated) char * __cdecl ltoa( long _Val, char * _DstBuf, int _Radix); __declspec(noalias) __declspec(restrict) void * __cdecl xxx( void * _Memory ); +typedef __w64 unsigned long ULONG_PTR, *PULONG_PTR; +void * __ptr64 PtrToPtr64(const void *p) +{ + return((void * __ptr64) (unsigned __int64) (ULONG_PTR)p ); +} +__forceinline InterlockedBitTestAndSet (long *Base, long Bit) +{ + __asm { + mov eax, Bit + mov ecx, Base + lock bts [ecx], eax + setc al + }; +} + |