[cfe-dev] [Patch] _Thread_local and _Alignof

Ed Schouten ed at 80386.nl
Wed Feb 8 12:22:28 PST 2012


Hi all,

Attached is a patch that adds support for the C11 keywords _Thread_local
and _Alignof. Essentially I have patched TokenKinds.def to define these
and let the GCC-specific __thread and __alignof to be aliases to them.

While there, remove the ext_thread_before warning, which used to trigger
warnings when doing:

	__thread static int i;

instead of:

	static __thread int i;

It seems the C11 standard allows _Thread_local to be used in both cases
and we'd better not implement __thread and _Thread_local differently.

Greetings,
-- 
 Ed Schouten <ed at 80386.nl>
 WWW: http://80386.nl/
-------------- next part --------------
Index: docs/UsersManual.html
===================================================================
--- docs/UsersManual.html	(revision 150082)
+++ docs/UsersManual.html	(working copy)
@@ -1064,7 +1064,7 @@
 <h4 id="target_os_darwin">Darwin (Mac OS/X)</h4>
 <!-- ======================================= -->
 
-<p>No __thread support, 64-bit ObjC support requires SL tools.</p>
+<p>No _Thread_local support, 64-bit ObjC support requires SL tools.</p>
 
 <!-- ======================================= -->
 <h4 id="target_os_win32">Windows</h4>
Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp	(revision 150082)
+++ lib/Sema/SemaDecl.cpp	(working copy)
@@ -2482,7 +2482,7 @@
         << DeclSpec::getSpecifierName(scs);
 
   if (DS.isThreadSpecified())
-    Diag(DS.getThreadSpecLoc(), diag::warn_standalone_specifier) << "__thread";
+    Diag(DS.getThreadSpecLoc(), diag::warn_standalone_specifier) << "_Thread_local";
   if (DS.getTypeQualifiers()) {
     if (DS.getTypeQualifiers() & DeclSpec::TQ_const)
       Diag(DS.getConstSpecLoc(), diag::warn_standalone_specifier) << "const";
Index: lib/Sema/DeclSpec.cpp
===================================================================
--- lib/Sema/DeclSpec.cpp	(revision 150082)
+++ lib/Sema/DeclSpec.cpp	(working copy)
@@ -469,7 +469,7 @@
                                          const char *&PrevSpec,
                                          unsigned &DiagID) {
   if (SCS_thread_specified) {
-    PrevSpec = "__thread";
+    PrevSpec = "_Thread_local";
     DiagID = diag::ext_duplicate_declspec;
     return true;
   }
Index: lib/Sema/SemaExpr.cpp
===================================================================
--- lib/Sema/SemaExpr.cpp	(revision 150082)
+++ lib/Sema/SemaExpr.cpp	(working copy)
@@ -2844,7 +2844,7 @@
 }
 
 /// ActOnUnaryExprOrTypeTraitExpr - Handle @c sizeof(type) and @c sizeof @c
-/// expr and the same for @c alignof and @c __alignof
+/// expr and the same for @c alignof and @c _Alignof
 /// Note that the ArgRange is invalid if isType is false.
 ExprResult
 Sema::ActOnUnaryExprOrTypeTraitExpr(SourceLocation OpLoc,
Index: lib/AST/DeclPrinter.cpp
===================================================================
--- lib/AST/DeclPrinter.cpp	(revision 150082)
+++ lib/AST/DeclPrinter.cpp	(working copy)
@@ -609,7 +609,7 @@
     Out << VarDecl::getStorageClassSpecifierString(SCAsWritten) << " ";
 
   if (!Policy.SuppressSpecifiers && D->isThreadSpecified())
-    Out << "__thread ";
+    Out << "_Thread_local ";
   if (!Policy.SuppressSpecifiers && D->isModulePrivate())
     Out << "__module_private__ ";
 
Index: lib/AST/StmtDumper.cpp
===================================================================
--- lib/AST/StmtDumper.cpp	(revision 150082)
+++ lib/AST/StmtDumper.cpp	(working copy)
@@ -468,7 +468,7 @@
     OS << " sizeof ";
     break;
   case UETT_AlignOf:
-    OS << " __alignof ";
+    OS << " _Alignof ";
     break;
   case UETT_VecStep:
     OS << " vec_step ";
Index: lib/AST/ExprConstant.cpp
===================================================================
--- lib/AST/ExprConstant.cpp	(revision 150082)
+++ lib/AST/ExprConstant.cpp	(working copy)
@@ -1291,7 +1291,7 @@
 
 /// Get the size of the given type in char units.
 static bool HandleSizeof(EvalInfo &Info, QualType Type, CharUnits &Size) {
-  // sizeof(void), __alignof__(void), sizeof(function) = 1 as a gcc
+  // sizeof(void), _Alignof(void), sizeof(function) = 1 as a gcc
   // extension.
   if (Type->isVoidType() || Type->isFunctionType()) {
     Size = CharUnits::One();
@@ -4762,7 +4762,7 @@
   if (const ReferenceType *Ref = T->getAs<ReferenceType>())
     T = Ref->getPointeeType();
 
-  // __alignof is defined to return the preferred alignment.
+  // _Alignof is defined to return the preferred alignment.
   return Info.Ctx.toCharUnitsFromBits(
     Info.Ctx.getPreferredTypeAlign(T.getTypePtr()));
 }
Index: lib/AST/StmtPrinter.cpp
===================================================================
--- lib/AST/StmtPrinter.cpp	(revision 150082)
+++ lib/AST/StmtPrinter.cpp	(working copy)
@@ -826,7 +826,7 @@
     OS << "sizeof";
     break;
   case UETT_AlignOf:
-    OS << "__alignof";
+    OS << "_Alignof";
     break;
   case UETT_VecStep:
     OS << "vec_step";
Index: lib/Parse/ParseDecl.cpp
===================================================================
--- lib/Parse/ParseDecl.cpp	(revision 150082)
+++ lib/Parse/ParseDecl.cpp	(working copy)
@@ -1659,7 +1659,7 @@
 ///         'auto'
 ///         'register'
 /// [C++]   'mutable'
-/// [GNU]   '__thread'
+/// [C11]   '_Thread_local'
 ///       function-specifier: [C99 6.7.4]
 /// [C99]   'inline'
 /// [C++]   'virtual'
@@ -2043,8 +2043,6 @@
                                          PrevSpec, DiagID);
       break;
     case tok::kw_extern:
-      if (DS.isThreadSpecified())
-        Diag(Tok, diag::ext_thread_before) << "extern";
       isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_extern, Loc,
                                          PrevSpec, DiagID);
       break;
@@ -2053,8 +2051,6 @@
                                          Loc, PrevSpec, DiagID);
       break;
     case tok::kw_static:
-      if (DS.isThreadSpecified())
-        Diag(Tok, diag::ext_thread_before) << "static";
       isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_static, Loc,
                                          PrevSpec, DiagID);
       break;
@@ -2081,7 +2077,7 @@
       isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_mutable, Loc,
                                          PrevSpec, DiagID);
       break;
-    case tok::kw___thread:
+    case tok::kw__Thread_local:
       isInvalid = DS.SetStorageClassSpecThread(Loc, PrevSpec, DiagID);
       break;
 
@@ -3427,7 +3423,7 @@
   case tok::kw_static:
   case tok::kw_auto:
   case tok::kw_register:
-  case tok::kw___thread:
+  case tok::kw__Thread_local:
 
     // Modules
   case tok::kw___module_private__:
Index: lib/Parse/ParseObjc.cpp
===================================================================
--- lib/Parse/ParseObjc.cpp	(revision 150082)
+++ lib/Parse/ParseObjc.cpp	(working copy)
@@ -661,7 +661,7 @@
 ///     identifier
 ///     one of
 ///       enum struct union if else while do for switch case default
-///       break continue return goto asm sizeof typeof __alignof
+///       break continue return goto asm sizeof typeof _Alignof
 ///       unsigned long const short volatile signed restrict _Complex
 ///       in out inout bycopy byref oneway int char float double void _Bool
 ///
@@ -736,6 +736,7 @@
   case tok::kw_short:
   case tok::kw_signed:
   case tok::kw_sizeof:
+  case tok::kw__Alignof:
   case tok::kw_static:
   case tok::kw_static_cast:
   case tok::kw_struct:
@@ -759,7 +760,6 @@
   case tok::kw_while:
   case tok::kw__Bool:
   case tok::kw__Complex:
-  case tok::kw___alignof:
     IdentifierInfo *II = Tok.getIdentifierInfo();
     SelectorLoc = ConsumeToken();
     return II;
Index: lib/Parse/ParseTentative.cpp
===================================================================
--- lib/Parse/ParseTentative.cpp	(revision 150082)
+++ lib/Parse/ParseTentative.cpp	(working copy)
@@ -639,6 +639,7 @@
   case tok::tilde:
   case tok::exclaim:
   case tok::kw_sizeof:
+  case tok::kw__Alignof:
   case tok::kw___func__:
   case tok::kw_const_cast:
   case tok::kw_delete:
@@ -656,7 +657,6 @@
   case tok::kw_noexcept:
   case tok::kw_nullptr:
   case tok::kw___null:
-  case tok::kw___alignof:
   case tok::kw___builtin_choose_expr:
   case tok::kw___builtin_offsetof:
   case tok::kw___builtin_types_compatible_p:
@@ -720,7 +720,7 @@
   case tok::kw__Decimal32:
   case tok::kw__Decimal64:
   case tok::kw__Decimal128:
-  case tok::kw___thread:
+  case tok::kw__Thread_local:
   case tok::kw_typeof:
   case tok::kw___cdecl:
   case tok::kw___stdcall:
@@ -759,7 +759,7 @@
 ///           'extern'
 ///           'mutable'
 ///           'auto'
-/// [GNU]     '__thread'
+/// [C11]     '_Thread_local'
 ///
 ///         function-specifier:
 ///           'inline'
@@ -881,7 +881,7 @@
   case tok::kw_extern:
   case tok::kw_mutable:
   case tok::kw_auto:
-  case tok::kw___thread:
+  case tok::kw__Thread_local:
     // function-specifier
   case tok::kw_inline:
   case tok::kw_virtual:
Index: lib/Parse/ParseExpr.cpp
===================================================================
--- lib/Parse/ParseExpr.cpp	(revision 150082)
+++ lib/Parse/ParseExpr.cpp	(working copy)
@@ -472,8 +472,8 @@
 ///         'sizeof' unary-expression
 ///         'sizeof' '(' type-name ')'
 /// [C++0x] 'sizeof' '...' '(' identifier ')'
-/// [GNU]   '__alignof' unary-expression
-/// [GNU]   '__alignof' '(' type-name ')'
+/// [C11]   '_Alignof' unary-expression
+/// [C11]   '_Alignof' '(' type-name ')'
 /// [C++0x] 'alignof' '(' type-id ')'
 /// [GNU]   '&&' identifier
 /// [C++]   new-expression
@@ -882,8 +882,8 @@
   case tok::kw_sizeof:     // unary-expression: 'sizeof' unary-expression
                            // unary-expression: 'sizeof' '(' type-name ')'
   case tok::kw_alignof:
-  case tok::kw___alignof:  // unary-expression: '__alignof' unary-expression
-                           // unary-expression: '__alignof' '(' type-name ')'
+  case tok::kw__Alignof:   // unary-expression: '_Alignof' unary-expression
+                           // unary-expression: '_Alignof' '(' type-name ')'
                            // unary-expression: 'alignof' '(' type-id ')'
   case tok::kw_vec_step:   // unary-expression: OpenCL 'vec_step' expression
     return ParseUnaryExprOrTypeTraitExpression();
@@ -1440,8 +1440,8 @@
 ///       unary-expression:  [C99 6.5.3]
 ///         'sizeof' unary-expression
 ///         'sizeof' '(' type-name ')'
-/// [GNU]   '__alignof' unary-expression
-/// [GNU]   '__alignof' '(' type-name ')'
+/// [C11]   '_Alignof' unary-expression
+/// [C11]   '_Alignof' '(' type-name ')'
 /// [C++0x] 'alignof' '(' type-id ')'
 ///
 /// [GNU]   typeof-specifier:
@@ -1459,8 +1459,8 @@
                                            ParsedType &CastTy,
                                            SourceRange &CastRange) {
 
-  assert((OpTok.is(tok::kw_typeof)    || OpTok.is(tok::kw_sizeof) ||
-          OpTok.is(tok::kw___alignof) || OpTok.is(tok::kw_alignof) ||
+  assert((OpTok.is(tok::kw_typeof)   || OpTok.is(tok::kw_sizeof)  ||
+          OpTok.is(tok::kw__Alignof) || OpTok.is(tok::kw_alignof) ||
           OpTok.is(tok::kw_vec_step)) &&
           "Not a typeof/sizeof/alignof/vec_step expression!");
 
@@ -1515,11 +1515,11 @@
 ///         'sizeof' unary-expression
 ///         'sizeof' '(' type-name ')'
 /// [C++0x] 'sizeof' '...' '(' identifier ')'
-/// [GNU]   '__alignof' unary-expression
-/// [GNU]   '__alignof' '(' type-name ')'
+/// [C11]   '_Alignof' unary-expression
+/// [C11]   '_Alignof' '(' type-name ')'
 /// [C++0x] 'alignof' '(' type-id ')'
 ExprResult Parser::ParseUnaryExprOrTypeTraitExpression() {
-  assert((Tok.is(tok::kw_sizeof) || Tok.is(tok::kw___alignof)
+  assert((Tok.is(tok::kw_sizeof) || Tok.is(tok::kw__Alignof)
           || Tok.is(tok::kw_alignof) || Tok.is(tok::kw_vec_step)) &&
          "Not a sizeof/alignof/vec_step expression!");
   Token OpTok = Tok;
@@ -1582,7 +1582,7 @@
                                                           CastRange);
 
   UnaryExprOrTypeTrait ExprKind = UETT_SizeOf;
-  if (OpTok.is(tok::kw_alignof) || OpTok.is(tok::kw___alignof))
+  if (OpTok.is(tok::kw_alignof) || OpTok.is(tok::kw__Alignof))
     ExprKind = UETT_AlignOf;
   else if (OpTok.is(tok::kw_vec_step))
     ExprKind = UETT_VecStep;
Index: lib/Serialization/ASTWriterDecl.cpp
===================================================================
--- lib/Serialization/ASTWriterDecl.cpp	(revision 150082)
+++ lib/Serialization/ASTWriterDecl.cpp	(working copy)
@@ -740,7 +740,7 @@
   // Check things we know are true of *every* PARM_VAR_DECL, which is more than
   // just us assuming it.
   assert(!D->isInvalidDecl() && "Shouldn't emit invalid decls");
-  assert(!D->isThreadSpecified() && "PARM_VAR_DECL can't be __thread");
+  assert(!D->isThreadSpecified() && "PARM_VAR_DECL can't be _Thread_local");
   assert(D->getAccess() == AS_none && "PARM_VAR_DECL can't be public/private");
   assert(!D->isExceptionVariable() && "PARM_VAR_DECL can't be exception var");
   assert(D->getPreviousDecl() == 0 && "PARM_VAR_DECL can't be redecl");
Index: test/Sema/thread-specifier.c
===================================================================
--- test/Sema/thread-specifier.c	(revision 150082)
+++ test/Sema/thread-specifier.c	(working copy)
@@ -5,17 +5,23 @@
 __thread static int t3;
 __thread __private_extern__ int t4;
 struct t5 { __thread int x; }; // expected-error {{type name does not allow storage class to be specified}}
-__thread int t6(); // expected-error {{'__thread' is only allowed on variable declarations}}
-int f(__thread int t7) { // expected-error {{'__thread' is only allowed on variable declarations}}
-  __thread int t8; // expected-error {{'__thread' variables must have global storage}}
+__thread int t6(); // expected-error {{'_Thread_local' is only allowed on variable declarations}}
+int f(__thread int t7) { // expected-error {{'_Thread_local' is only allowed on variable declarations}}
+  __thread int t8; // expected-error {{'_Thread_local' variables must have global storage}}
   __thread extern int t9;
   __thread static int t10;
   __thread __private_extern__ int t11;
-  __thread auto int t12; // expected-error {{'__thread' variables must have global storage}}
-  __thread register int t13; // expected-error {{'__thread' variables must have global storage}}
+  __thread auto int t12; // expected-error {{'_Thread_local' variables must have global storage}}
+  __thread register int t13; // expected-error {{'_Thread_local' variables must have global storage}}
 }
-__thread typedef int t14; // expected-error {{'__thread' is only allowed on variable declarations}}
+__thread typedef int t14; // expected-error {{'_Thread_local' is only allowed on variable declarations}}
 __thread int t15; // expected-note {{previous definition is here}}
 int t15; // expected-error {{non-thread-local declaration of 't15' follows thread-local declaration}}
 int t16; // expected-note {{previous definition is here}}
 __thread int t16; // expected-error {{thread-local declaration of 't16' follows non-thread-local declaration}}
+
+_Thread_local int t17;
+_Thread_local extern int t18;
+_Thread_local static int t19;
+extern _Thread_local int t20;
+static _Thread_local int t21;
Index: test/Sema/exprs.c
===================================================================
--- test/Sema/exprs.c	(revision 150082)
+++ test/Sema/exprs.c	(working copy)
@@ -94,8 +94,10 @@
 struct f { int x : 4;  float y[]; };
 int test9(struct f *P) {
   int R;
-  R = __alignof(P->x);  // expected-error {{invalid application of '__alignof' to bit-field}}
+  R = __alignof(P->x);  // expected-error {{invalid application of '_Alignof' to bit-field}}
   R = __alignof(P->y);   // ok.
+  R = _Alignof(P->x);   // expected-error {{invalid application of '_Alignof' to bit-field}}
+  R = _Alignof(P->y);    // ok.
   R = sizeof(P->x); // expected-error {{invalid application of 'sizeof' to bit-field}}
   return R;
 }
Index: test/Misc/warning-flags.c
===================================================================
--- test/Misc/warning-flags.c	(revision 150082)
+++ test/Misc/warning-flags.c	(working copy)
@@ -17,7 +17,7 @@
 
 The list of warnings below should NEVER grow.  It should gradually shrink to 0.
 
-CHECK: Warnings without flags (266):
+CHECK: Warnings without flags (265):
 CHECK-NEXT:   ext_anon_param_requires_type_specifier
 CHECK-NEXT:   ext_anonymous_struct_union_qualified
 CHECK-NEXT:   ext_array_init_copy
@@ -67,7 +67,6 @@
 CHECK-NEXT:   ext_return_has_void_expr
 CHECK-NEXT:   ext_subscript_non_lvalue
 CHECK-NEXT:   ext_template_arg_extra_parens
-CHECK-NEXT:   ext_thread_before
 CHECK-NEXT:   ext_top_level_semi
 CHECK-NEXT:   ext_typecheck_addrof_void
 CHECK-NEXT:   ext_typecheck_cast_nonscalar
Index: include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- include/clang/Basic/DiagnosticSemaKinds.td	(revision 150082)
+++ include/clang/Basic/DiagnosticSemaKinds.td	(working copy)
@@ -253,9 +253,9 @@
   InGroup<ExitTimeDestructors>, DefaultIgnore;
 
 def err_invalid_thread : Error<
-  "'__thread' is only allowed on variable declarations">;
+  "'_Thread_local' is only allowed on variable declarations">;
 def err_thread_non_global : Error<
-  "'__thread' variables must have global storage">;
+  "'_Thread_local' variables must have global storage">;
 def err_thread_unsupported : Error<
   "thread-local storage is unsupported for the current target">;
 
@@ -3407,16 +3407,16 @@
 def ext_sizeof_function_type : Extension<
   "invalid application of 'sizeof' to a function type">, InGroup<PointerArith>;
 def err_sizeof_alignof_overloaded_function_type : Error<
-  "invalid application of '%select{sizeof|__alignof|vec_step}0' to an "
+  "invalid application of '%select{sizeof|_Alignof|vec_step}0' to an "
   "overloaded function">;
 def ext_sizeof_void_type : Extension<
-  "invalid application of '%select{sizeof|__alignof|vec_step}0' to a void "
+  "invalid application of '%select{sizeof|_Alignof|vec_step}0' to a void "
   "type">, InGroup<PointerArith>;
 def err_sizeof_alignof_incomplete_type : Error<
-  "invalid application of '%select{sizeof|__alignof|vec_step}0' to an "
+  "invalid application of '%select{sizeof|_Alignof|vec_step}0' to an "
   "incomplete type %1">;
 def err_sizeof_alignof_bitfield : Error<
-  "invalid application of '%select{sizeof|__alignof}0' to bit-field">;
+  "invalid application of '%select{sizeof|_Alignof}0' to bit-field">;
 def err_vecstep_non_scalar_vector_type : Error<
   "'vec_step' requires built-in scalar or vector type, %0 invalid">;
 def err_offsetof_incomplete_type : Error<
Index: include/clang/Basic/TokenKinds.def
===================================================================
--- include/clang/Basic/TokenKinds.def	(revision 150082)
+++ include/clang/Basic/TokenKinds.def	(working copy)
@@ -251,12 +251,14 @@
 KEYWORD(volatile                    , KEYALL)
 KEYWORD(while                       , KEYALL)
 KEYWORD(_Alignas                    , KEYALL)
+KEYWORD(_Alignof                    , KEYALL)
 KEYWORD(_Atomic                     , KEYALL)
 KEYWORD(_Bool                       , KEYNOCXX)
 KEYWORD(_Complex                    , KEYALL)
 KEYWORD(_Generic                    , KEYALL)
 KEYWORD(_Imaginary                  , KEYALL)
 KEYWORD(_Static_assert              , KEYALL)
+KEYWORD(_Thread_local               , KEYALL)
 KEYWORD(__func__                    , KEYALL)
 
 // C++ 2.11p1: Keywords.
@@ -321,7 +323,6 @@
 KEYWORD(_Decimal64                  , KEYALL)
 KEYWORD(_Decimal128                 , KEYALL)
 KEYWORD(__null                      , KEYCXX)
-KEYWORD(__alignof                   , KEYALL)
 KEYWORD(__attribute                 , KEYALL)
 KEYWORD(__builtin_choose_expr       , KEYALL)
 KEYWORD(__builtin_offsetof          , KEYALL)
@@ -331,7 +332,6 @@
 KEYWORD(__imag                      , KEYALL)
 KEYWORD(__label__                   , KEYALL)
 KEYWORD(__real                      , KEYALL)
-KEYWORD(__thread                    , KEYALL)
 KEYWORD(__FUNCTION__                , KEYALL)
 KEYWORD(__PRETTY_FUNCTION__         , KEYALL)
 
@@ -456,28 +456,30 @@
 
 // Alternate spelling for various tokens.  There are GCC extensions in all
 // languages, but should not be disabled in strict conformance mode.
-ALIAS("__alignof__"  , __alignof  , KEYALL)
-ALIAS("__asm"        , asm        , KEYALL)
-ALIAS("__asm__"      , asm        , KEYALL)
-ALIAS("__attribute__", __attribute, KEYALL)
-ALIAS("__complex"    , _Complex   , KEYALL)
-ALIAS("__complex__"  , _Complex   , KEYALL)
-ALIAS("__const"      , const      , KEYALL)
-ALIAS("__const__"    , const      , KEYALL)
-ALIAS("__decltype"   , decltype   , KEYCXX)
-ALIAS("__imag__"     , __imag     , KEYALL)
-ALIAS("__inline"     , inline     , KEYALL)
-ALIAS("__inline__"   , inline     , KEYALL)
-ALIAS("__nullptr"    , nullptr    , KEYCXX)
-ALIAS("__real__"     , __real     , KEYALL)
-ALIAS("__restrict"   , restrict   , KEYALL)
-ALIAS("__restrict__" , restrict   , KEYALL)
-ALIAS("__signed"     , signed     , KEYALL)
-ALIAS("__signed__"   , signed     , KEYALL)
-ALIAS("__typeof"     , typeof     , KEYALL)
-ALIAS("__typeof__"   , typeof     , KEYALL)
-ALIAS("__volatile"   , volatile   , KEYALL)
-ALIAS("__volatile__" , volatile   , KEYALL)
+ALIAS("__alignof"    , _Alignof     , KEYALL)
+ALIAS("__alignof__"  , _Alignof     , KEYALL)
+ALIAS("__asm"        , asm          , KEYALL)
+ALIAS("__asm__"      , asm          , KEYALL)
+ALIAS("__attribute__", __attribute  , KEYALL)
+ALIAS("__complex"    , _Complex     , KEYALL)
+ALIAS("__complex__"  , _Complex     , KEYALL)
+ALIAS("__const"      , const        , KEYALL)
+ALIAS("__const__"    , const        , KEYALL)
+ALIAS("__decltype"   , decltype     , KEYCXX)
+ALIAS("__imag__"     , __imag       , KEYALL)
+ALIAS("__inline"     , inline       , KEYALL)
+ALIAS("__inline__"   , inline       , KEYALL)
+ALIAS("__nullptr"    , nullptr      , KEYCXX)
+ALIAS("__real__"     , __real       , KEYALL)
+ALIAS("__restrict"   , restrict     , KEYALL)
+ALIAS("__restrict__" , restrict     , KEYALL)
+ALIAS("__signed"     , signed       , KEYALL)
+ALIAS("__signed__"   , signed       , KEYALL)
+ALIAS("__thread"     , _Thread_local, KEYALL)
+ALIAS("__typeof"     , typeof       , KEYALL)
+ALIAS("__typeof__"   , typeof       , KEYALL)
+ALIAS("__volatile"   , volatile     , KEYALL)
+ALIAS("__volatile__" , volatile     , KEYALL)
 
 // Microsoft extensions which should be disabled in strict conformance mode
 KEYWORD(__ptr64                   , KEYMS)
Index: include/clang/Basic/DiagnosticParseKinds.td
===================================================================
--- include/clang/Basic/DiagnosticParseKinds.td	(revision 150082)
+++ include/clang/Basic/DiagnosticParseKinds.td	(working copy)
@@ -36,7 +36,6 @@
   "plain '_Complex' requires a type specifier; assuming '_Complex double'">;
 def ext_integer_complex : Extension<
   "complex integer types are an extension">;
-def ext_thread_before : Extension<"'__thread' before 'static'">;
 
 def ext_empty_struct_union : Extension<
   "empty %select{struct|union}0 is a GNU extension">, InGroup<GNU>;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 834 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20120208/43f02af8/attachment.sig>


More information about the cfe-dev mailing list