[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