]> granicus.if.org Git - clang/commitdiff
Add support for Microsoft __ptr32 keyword.
authorFrancois Pichet <pichet2000@gmail.com>
Thu, 25 Aug 2011 00:36:46 +0000 (00:36 +0000)
committerFrancois Pichet <pichet2000@gmail.com>
Thu, 25 Aug 2011 00:36:46 +0000 (00:36 +0000)
Patch by Chris Cudmore!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@138533 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/TokenKinds.def
lib/Parse/ParseDecl.cpp
lib/Parse/ParseTentative.cpp
test/Parser/MicrosoftExtensions.c

index 95bfca446a5a9eecafe91060552a7ef2e14e669b..e0b22b7b24a8376c57783ad7cfce4235af15bfcb 100644 (file)
@@ -466,6 +466,7 @@ ALIAS("__volatile__" , volatile   , KEYALL)
 
 // Microsoft extensions which should be disabled in strict conformance mode
 KEYWORD(__ptr64                   , KEYMS)
+KEYWORD(__ptr32                   , KEYMS)
 KEYWORD(__w64                     , KEYMS)
 KEYWORD(__uuidof                  , KEYMS | KEYBORLAND)
 KEYWORD(__try                     , KEYMS | KEYBORLAND)
index 2316590afe67de9bec71cb40ed18238cd5de7f9d..9e2fb259476c7dd8b1ea6518f4cdfb57bd6003de 100644 (file)
@@ -303,10 +303,12 @@ void Parser::ParseMicrosoftTypeAttributes(ParsedAttributes &attrs) {
   while (Tok.is(tok::kw___fastcall) || Tok.is(tok::kw___stdcall) ||
          Tok.is(tok::kw___thiscall) || Tok.is(tok::kw___cdecl)   ||
          Tok.is(tok::kw___ptr64) || Tok.is(tok::kw___w64) ||
+         Tok.is(tok::kw___ptr32) ||
          Tok.is(tok::kw___unaligned)) {
     IdentifierInfo *AttrName = Tok.getIdentifierInfo();
     SourceLocation AttrNameLoc = ConsumeToken();
-    if (Tok.is(tok::kw___ptr64) || Tok.is(tok::kw___w64))
+    if (Tok.is(tok::kw___ptr64) || Tok.is(tok::kw___w64) ||
+        Tok.is(tok::kw___ptr32))
       // FIXME: Support these properly!
       continue;
     attrs.addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 0,
@@ -1722,6 +1724,7 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
       break;
 
     case tok::kw___ptr64:
+    case tok::kw___ptr32:
     case tok::kw___w64:
     case tok::kw___cdecl:
     case tok::kw___stdcall:
@@ -2271,6 +2274,7 @@ bool Parser::ParseOptionalTypeSpecifier(DeclSpec &DS, bool& isInvalid,
     break;
 
   case tok::kw___ptr64:
+  case tok::kw___ptr32:
   case tok::kw___w64:
   case tok::kw___cdecl:
   case tok::kw___stdcall:
@@ -2985,6 +2989,7 @@ bool Parser::isTypeSpecifierQualifier() {
   case tok::kw___thiscall:
   case tok::kw___w64:
   case tok::kw___ptr64:
+  case tok::kw___ptr32:
   case tok::kw___pascal:
   case tok::kw___unaligned:
 
@@ -3132,6 +3137,7 @@ bool Parser::isDeclarationSpecifier(bool DisambiguatingWithExpression) {
   case tok::kw___thiscall:
   case tok::kw___w64:
   case tok::kw___ptr64:
+  case tok::kw___ptr32:
   case tok::kw___forceinline:
   case tok::kw___pascal:
   case tok::kw___unaligned:
@@ -3266,6 +3272,7 @@ void Parser::ParseTypeQualifierListOpt(DeclSpec &DS,
 
     case tok::kw___w64:
     case tok::kw___ptr64:
+    case tok::kw___ptr32:
     case tok::kw___cdecl:
     case tok::kw___stdcall:
     case tok::kw___fastcall:
@@ -3684,7 +3691,7 @@ void Parser::ParseParenDeclarator(Declarator &D) {
   if  (Tok.is(tok::kw___cdecl) || Tok.is(tok::kw___stdcall) ||
        Tok.is(tok::kw___thiscall) || Tok.is(tok::kw___fastcall) ||
        Tok.is(tok::kw___w64) || Tok.is(tok::kw___ptr64) ||
-       Tok.is(tok::kw___unaligned)) {
+       Tok.is(tok::kw___ptr32) || Tok.is(tok::kw___unaligned)) {
     ParseMicrosoftTypeAttributes(attrs);
   }
   // Eat any Borland extensions.
index e354f57b70bf6d17a4dcb2417a918e4d62034327..f0f4c2c72920edaf577070193d1f837a9fa83458 100644 (file)
@@ -904,6 +904,7 @@ Parser::TPResult Parser::isCXXDeclarationSpecifier() {
   case tok::kw___thiscall:
   case tok::kw___w64:
   case tok::kw___ptr64:
+  case tok::kw___ptr32:
   case tok::kw___forceinline:
   case tok::kw___unaligned:\r
     return TPResult::True();
index 2b8451b26dda7a102c5679b0bcf6780ccd3c552b..d03ada84b9eabb9853cd6f90a44433ae802079b7 100644 (file)
@@ -8,10 +8,16 @@ 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 );
 }
+void * __ptr32 PtrToPtr32(const void *p)
+{
+  return((void * __ptr32) (unsigned __int32) (ULONG_PTR)p );
+}
+
 void __forceinline InterlockedBitTestAndSet (long *Base, long Bit)
 {
   __asm {