Index: clang/include/clang/Basic/DiagnosticParseKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticParseKinds.td +++ clang/include/clang/Basic/DiagnosticParseKinds.td @@ -126,7 +126,7 @@ def note_previous_default_assoc : Note< "previous default generic association is here">; -def ext_c11_alignment : Extension< +def ext_c11_feature : Extension< "%0 is a C11-specific feature">, InGroup; def ext_c11_noreturn : Extension< Index: clang/lib/Parse/ParseDecl.cpp =================================================================== --- clang/lib/Parse/ParseDecl.cpp +++ clang/lib/Parse/ParseDecl.cpp @@ -3566,6 +3566,8 @@ isStorageClass = true; break; case tok::kw__Thread_local: + if (!getLangOpts().C11) + Diag(Tok, diag::ext_c11_feature) << Tok.getName(); isInvalid = DS.SetStorageClassSpecThread(DeclSpec::TSCS__Thread_local, Loc, PrevSpec, DiagID); isStorageClass = true; @@ -3623,7 +3625,7 @@ // alignment-specifier case tok::kw__Alignas: if (!getLangOpts().C11) - Diag(Tok, diag::ext_c11_alignment) << Tok.getName(); + Diag(Tok, diag::ext_c11_feature) << Tok.getName(); ParseAlignmentSpecifier(DS.getAttributes()); continue; Index: clang/lib/Parse/ParseExpr.cpp =================================================================== --- clang/lib/Parse/ParseExpr.cpp +++ clang/lib/Parse/ParseExpr.cpp @@ -1191,7 +1191,7 @@ } case tok::kw__Alignof: // unary-expression: '_Alignof' '(' type-name ')' if (!getLangOpts().C11) - Diag(Tok, diag::ext_c11_alignment) << Tok.getName(); + Diag(Tok, diag::ext_c11_feature) << Tok.getName(); LLVM_FALLTHROUGH; case tok::kw_alignof: // unary-expression: 'alignof' '(' type-id ')' case tok::kw___alignof: // unary-expression: '__alignof' unary-expression Index: clang/test/PCH/thread-local.cpp =================================================================== --- clang/test/PCH/thread-local.cpp +++ clang/test/PCH/thread-local.cpp @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 -pedantic-errors -std=c++11 -triple x86_64-linux-gnu -emit-pch %s -o %t -// RUN: %clang_cc1 -pedantic-errors -std=c++11 -triple x86_64-linux-gnu -include-pch %t -verify %s +// RUN: %clang_cc1 -pedantic-errors -Wno-c11-extensions -std=c++11 -triple x86_64-linux-gnu -emit-pch %s -o %t +// RUN: %clang_cc1 -pedantic-errors -Wno-c11-extensions -std=c++11 -triple x86_64-linux-gnu -include-pch %t -verify %s // REQUIRES: x86-registered-target #ifndef HEADER_INCLUDED Index: clang/test/Sema/thread-specifier.c =================================================================== --- clang/test/Sema/thread-specifier.c +++ clang/test/Sema/thread-specifier.c @@ -1,9 +1,10 @@ // RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only -Wno-private-extern -verify -pedantic %s -DGNU // RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only -Wno-private-extern -verify -pedantic -x c++ %s -DGNU -std=c++98 -// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only -Wno-private-extern -verify -pedantic %s -DC11 -D__thread=_Thread_local -// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only -Wno-private-extern -verify -pedantic -x c++ %s -DC11 -D__thread=_Thread_local -std=c++98 +// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only -Wno-private-extern -verify -pedantic %s -std=c11 -DC11 -D__thread=_Thread_local +// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only -Wno-private-extern -verify -pedantic -x c++ %s -DC11 -D__thread=_Thread_local -std=c++98 -DWARN_ON_THREAD_LOCAL // RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only -Wno-private-extern -verify -pedantic -x c++ %s -DCXX11 -D__thread=thread_local -std=c++11 -Wno-deprecated -// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only -Wno-private-extern -verify -pedantic -x c++ %s -DC11 -D__thread=_Thread_local -std=c++11 -Wno-deprecated +// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only -Wno-private-extern -verify -pedantic -x c++ %s -DC11 -D__thread=_Thread_local -std=c++11 -Wno-deprecated -DWARN_ON_THREAD_LOCAL +// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only -Wno-private-extern -verify -pedantic %s -std=c99 -D__thread=_Thread_local -DWARN_ON_THREAD_LOCAL -DC99 #ifdef __cplusplus // In C++, we define __private_extern__ to extern. @@ -30,7 +31,7 @@ __thread int t6(); #if defined(GNU) // expected-error@-2 {{'__thread' is only allowed on variable declarations}} -#elif defined(C11) +#elif defined(C11) || defined(C99) // expected-error@-4 {{'_Thread_local' is only allowed on variable declarations}} #else // expected-error@-6 {{'thread_local' is only allowed on variable declarations}} @@ -40,7 +41,7 @@ __thread int t8; #if defined(GNU) // expected-error@-2 {{'__thread' variables must have global storage}} -#elif defined(C11) +#elif defined(C11) || defined(C99) // expected-error@-4 {{'_Thread_local' variables must have global storage}} #endif extern __thread int t9; @@ -121,3 +122,41 @@ #endif __thread int aggregate[10] = {0}; + +#ifdef WARN_ON_THREAD_LOCAL +// expected-warning@14 {{_Thread_local is a C11-specific feature}} +// expected-warning@15 {{_Thread_local is a C11-specific feature}} +// expected-warning@16 {{_Thread_local is a C11-specific feature}} +// expected-warning@22 {{_Thread_local is a C11-specific feature}} +// expected-warning@23 {{_Thread_local is a C11-specific feature}} +// expected-warning@31 {{_Thread_local is a C11-specific feature}} +// expected-warning@40 {{_Thread_local is a C11-specific feature}} +// expected-warning@41 {{_Thread_local is a C11-specific feature}} +// expected-warning@47 {{_Thread_local is a C11-specific feature}} +// expected-warning@48 {{_Thread_local is a C11-specific feature}} +// expected-warning@49 {{_Thread_local is a C11-specific feature}} +#if __cplusplus < 201103L +// expected-warning@51 {{_Thread_local is a C11-specific feature}} +// expected-warning@52 {{_Thread_local is a C11-specific feature}} +#elif !defined(CXX11) +// expected-warning@54 {{_Thread_local is a C11-specific feature}} +// expected-warning@55 {{_Thread_local is a C11-specific feature}} +#endif +// expected-warning@57 {{_Thread_local is a C11-specific feature}} +// expected-warning@58 {{_Thread_local is a C11-specific feature}} +// expected-warning@61 {{_Thread_local is a C11-specific feature}} +// expected-warning@62 {{_Thread_local is a C11-specific feature}} +// expected-warning@65 {{_Thread_local is a C11-specific feature}} +// expected-warning@75 {{_Thread_local is a C11-specific feature}} +// expected-warning@88 {{_Thread_local is a C11-specific feature}} +#ifdef __cplusplus +// expected-warning@102 {{_Thread_local is a C11-specific feature}} +// expected-warning@115 {{_Thread_local is a C11-specific feature}} +#endif +// expected-warning@124 {{_Thread_local is a C11-specific feature}} +#endif +#ifdef CXX11 +// expected-warning@69 {{_Thread_local is a C11-specific feature}} +// expected-warning@70 {{_Thread_local is a C11-specific feature}} +#endif + Index: clang/test/SemaOpenCLCXX/restricted.cl =================================================================== --- clang/test/SemaOpenCLCXX/restricted.cl +++ clang/test/SemaOpenCLCXX/restricted.cl @@ -31,6 +31,8 @@ // Test storage class qualifiers. __constant _Thread_local int a = 1; // expected-error@-1 {{C++ for OpenCL version 1.0 does not support the '_Thread_local' storage class specifier}} +// expected-warning@-2 {{_Thread_local is a C11-specific feature}} + __constant __thread int b = 2; // expected-error@-1 {{C++ for OpenCL version 1.0 does not support the '__thread' storage class specifier}} kernel void test_storage_classes() {