diff options
-rw-r--r-- | clang/include/clang/Basic/Attr.td | 4 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 20 | ||||
-rw-r--r-- | clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.noreturn/p1.cpp | 2 | ||||
-rw-r--r-- | clang/test/Parser/cxx0x-attributes.cpp | 16 | ||||
-rw-r--r-- | clang/test/Parser/objcxx11-attributes.mm | 4 |
5 files changed, 14 insertions, 32 deletions
diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 29addcb6189..ca70fec4118 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -369,13 +369,13 @@ def CUDAShared : InheritableAttr { def C11NoReturn : InheritableAttr { let Spellings = [Keyword<"_Noreturn">]; -// let Subjects = SubjectList<[Function], ErrorDiag>; + let Subjects = SubjectList<[Function], ErrorDiag>; let SemaHandler = 0; } def CXX11NoReturn : InheritableAttr { let Spellings = [CXX11<"","noreturn">, CXX11<"std","noreturn">]; -// let Subjects = SubjectList<[Function], ErrorDiag>; + let Subjects = SubjectList<[Function], ErrorDiag>; } def OpenCLKernel : InheritableAttr { diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index a8d336e2293..ccbf9ac1356 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -1672,23 +1672,6 @@ static void handleAnalyzerNoReturnAttr(Sema &S, Decl *D, Attr.getAttributeSpellingListIndex())); } -static void handleCXX11NoReturnAttr(Sema &S, Decl *D, - const AttributeList &Attr) { - // C++11 [dcl.attr.noreturn]p1: - // The attribute may be applied to the declarator-id in a function - // declaration. - FunctionDecl *FD = dyn_cast<FunctionDecl>(D); - if (!FD) { - S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type) - << Attr.getName() << ExpectedFunctionOrMethod; - return; - } - - D->addAttr(::new (S.Context) - CXX11NoReturnAttr(Attr.getRange(), S.Context, - Attr.getAttributeSpellingListIndex())); -} - // PS3 PPU-specific. static void handleVecReturnAttr(Sema &S, Decl *D, const AttributeList &Attr) { /* @@ -4195,8 +4178,7 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, case AttributeList::AT_CUDAConstant:handleConstantAttr (S, D, Attr); break; case AttributeList::AT_Constructor: handleConstructorAttr (S, D, Attr); break; case AttributeList::AT_CXX11NoReturn: - handleCXX11NoReturnAttr(S, D, Attr); - break; + handleSimpleAttribute<CXX11NoReturnAttr>(S, D, Attr); break; case AttributeList::AT_Deprecated: handleAttrWithMessage<DeprecatedAttr>(S, D, Attr); break; diff --git a/clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.noreturn/p1.cpp b/clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.noreturn/p1.cpp index 0af241f55fe..59cac367dbf 100644 --- a/clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.noreturn/p1.cpp +++ b/clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.noreturn/p1.cpp @@ -13,7 +13,7 @@ void a2 [[noreturn]] () { [[noreturn()]] void c(); // expected-error {{attribute 'noreturn' cannot have an argument list}} void d() [[noreturn]]; // expected-error {{'noreturn' attribute cannot be applied to types}} -int d2 [[noreturn]]; // expected-error {{'noreturn' attribute only applies to functions and methods}} +int d2 [[noreturn]]; // expected-error {{'noreturn' attribute only applies to functions}} [[noreturn]] int e() { b2(); } // ok diff --git a/clang/test/Parser/cxx0x-attributes.cpp b/clang/test/Parser/cxx0x-attributes.cpp index b02add98457..43176025642 100644 --- a/clang/test/Parser/cxx0x-attributes.cpp +++ b/clang/test/Parser/cxx0x-attributes.cpp @@ -78,11 +78,11 @@ class c [[]] [[]] y [[]] [[]]; class c final [(int){0}]; class base {}; -class [[]] [[]] final_class +class [[]] [[]] final_class alignas(float) [[]] final // expected-error {{an attribute list cannot appear here}} alignas(float) [[]] [[]] alignas(float): base{}; // expected-error {{an attribute list cannot appear here}} -class [[]] [[]] final_class_another +class [[]] [[]] final_class_another [[]] [[]] alignas(16) final // expected-error {{an attribute list cannot appear here}} [[]] [[]] alignas(16) [[]]{}; // expected-error {{an attribute list cannot appear here}} @@ -120,7 +120,7 @@ extern "C++" [[]] { } // expected-error {{an attribute list cannot appear here}} [[]] using ns::i; // expected-error {{an attribute list cannot appear here}} [[unknown]] using namespace ns; // expected-warning {{unknown attribute 'unknown' ignored}} -[[noreturn]] using namespace ns; // expected-error {{'noreturn' attribute only applies to functions and methods}} +[[noreturn]] using namespace ns; // expected-error {{'noreturn' attribute only applies to functions}} using [[]] alignas(4) [[]] ns::i; // expected-error {{an attribute list cannot appear here}} using [[]] alignas(4) [[]] foobar = int; // expected-error {{an attribute list cannot appear here}} expected-error {{'alignas' attribute only applies to}} @@ -146,7 +146,7 @@ template<typename T> using U [[]] = T; using ns::i [[]]; // expected-error {{an attribute list cannot appear here}} using [[]] ns::i; // expected-error {{an attribute list cannot appear here}} using T [[unknown]] = int; // expected-warning {{unknown attribute 'unknown' ignored}} -using T [[noreturn]] = int; // expected-error {{'noreturn' attribute only applies to functions and methods}} +using T [[noreturn]] = int; // expected-error {{'noreturn' attribute only applies to functions}} using V = int; // expected-note {{previous}} using V [[gnu::vector_size(16)]] = int; // expected-error {{redefinition with different types}} @@ -210,16 +210,16 @@ void foo () { [[]] continue; } while (0); [[]] while (0); - + [[]] switch (i) { [[]] case 0: [[]] default: [[]] break; } - + [[]] goto there; [[]] there: - + [[]] try { } [[]] catch (...) { // expected-error {{an attribute list cannot appear here}} } @@ -297,7 +297,7 @@ int v4[2][[gnu::unused]]; // expected-warning {{attribute 'unused' ignored}} int v5()[[gnu::unused]]; // expected-warning {{attribute 'unused' ignored}} [[attribute_declaration]]; // expected-warning {{unknown attribute 'attribute_declaration' ignored}} -[[noreturn]]; // expected-error {{'noreturn' attribute only applies to functions and methods}} +[[noreturn]]; // expected-error {{'noreturn' attribute only applies to functions}} [[carries_dependency]]; // expected-error {{'carries_dependency' attribute only applies to functions, methods, and parameters}} class A { diff --git a/clang/test/Parser/objcxx11-attributes.mm b/clang/test/Parser/objcxx11-attributes.mm index c1d8c4132dc..4bff2151a9c 100644 --- a/clang/test/Parser/objcxx11-attributes.mm +++ b/clang/test/Parser/objcxx11-attributes.mm @@ -13,12 +13,12 @@ void f(X *noreturn) { int a[ [noreturn getSize] ]; // ... but is interpreted as an attribute where possible. - int b[ [noreturn] ]; // expected-error {{'noreturn' attribute only applies to functions and methods}} + int b[ [noreturn] ]; // expected-error {{'noreturn' attribute only applies to functions}} int c[ [noreturn getSize] + 1 ]; // An array size which is computed by a lambda is not OK. - int d[ [noreturn] { return 3; } () ]; // expected-error {{expected ']'}} expected-error {{'noreturn' attribute only applies}} + int d[ [noreturn] { return 3; } () ]; // expected-error {{expected ']'}} expected-error {{'noreturn' attribute only applies to functions}} // A message send which contains a message send is OK. [ [ X alloc ] init ]; |