From: Alex Lorenz Date: Thu, 20 Apr 2017 09:35:02 +0000 (+0000) Subject: Add #pragma clang attribute support to the availability attribute X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ba88279757746998f8cffbad404fdf1de0bd5eb7;p=clang Add #pragma clang attribute support to the availability attribute rdar://31707804 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@300826 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/Attr.td b/include/clang/Basic/Attr.td index b6cb0f4607..44893fbd03 100644 --- a/include/clang/Basic/Attr.td +++ b/include/clang/Basic/Attr.td @@ -655,7 +655,7 @@ def Availability : InheritableAttr { } }]; let HasCustomParsing = 1; let DuplicatesAllowedWhileMerging = 1; -// let Subjects = SubjectList<[Named]>; + let Subjects = SubjectList<[Named]>; let Documentation = [AvailabilityDocs]; } diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index b87c8bfdd8..027b3fe0e7 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -2398,10 +2398,8 @@ static void handleAvailabilityAttr(Sema &S, Decl *D, << Platform->Ident; NamedDecl *ND = dyn_cast(D); - if (!ND) { - S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName(); + if (!ND) // We warned about this already, so just return. return; - } AvailabilityChange Introduced = Attr.getAvailabilityIntroduced(); AvailabilityChange Deprecated = Attr.getAvailabilityDeprecated(); diff --git a/test/Misc/pragma-attribute-supported-attributes-list.test b/test/Misc/pragma-attribute-supported-attributes-list.test index 5b58ba51b9..f6a7ce2869 100644 --- a/test/Misc/pragma-attribute-supported-attributes-list.test +++ b/test/Misc/pragma-attribute-supported-attributes-list.test @@ -2,7 +2,7 @@ // The number of supported attributes should never go down! -// CHECK: #pragma clang attribute supports 58 attributes: +// CHECK: #pragma clang attribute supports 59 attributes: // CHECK-NEXT: AMDGPUFlatWorkGroupSize (SubjectMatchRule_function) // CHECK-NEXT: AMDGPUNumSGPR (SubjectMatchRule_function) // CHECK-NEXT: AMDGPUNumVGPR (SubjectMatchRule_function) @@ -13,6 +13,7 @@ // CHECK-NEXT: AllocSize (SubjectMatchRule_function) // CHECK-NEXT: Annotate () // CHECK-NEXT: AssumeAligned (SubjectMatchRule_objc_method, SubjectMatchRule_function) +// CHECK-NEXT: Availability ((SubjectMatchRule_record, SubjectMatchRule_enum, SubjectMatchRule_enum_constant, SubjectMatchRule_field, SubjectMatchRule_function, SubjectMatchRule_namespace, SubjectMatchRule_objc_category, SubjectMatchRule_objc_interface, SubjectMatchRule_objc_method, SubjectMatchRule_objc_property, SubjectMatchRule_objc_protocol, SubjectMatchRule_record, SubjectMatchRule_type_alias, SubjectMatchRule_variable)) // CHECK-NEXT: CXX11NoReturn (SubjectMatchRule_function) // CHECK-NEXT: CallableWhen (SubjectMatchRule_function_is_member) // CHECK-NEXT: CarriesDependency (SubjectMatchRule_variable_is_parameter, SubjectMatchRule_objc_method, SubjectMatchRule_function) diff --git a/test/Parser/pragma-attribute.cpp b/test/Parser/pragma-attribute.cpp index b28ec8c2c8..f0ebca2c53 100644 --- a/test/Parser/pragma-attribute.cpp +++ b/test/Parser/pragma-attribute.cpp @@ -122,9 +122,9 @@ void function(); #pragma clang attribute push (__attribute__((annotate)) foo) // expected-error {{expected ','}} #pragma clang attribute push (__attribute__((annotate)), apply_to=function foo) // expected-error {{extra tokens after attribute in a '#pragma clang attribute push'}} -#pragma clang attribute push (__attribute__((availability(macos, foo=1))), apply_to=function) // expected-error {{'foo' is not an availability stage; use 'introduced', 'deprecated', or 'obsoleted'}} -// expected-error@-1 {{attribute 'availability' is not supported by '#pragma clang attribute'}} -#pragma clang attribute push (__attribute__((availability(macos, 1))), apply_to=function) // expected-error {{expected 'introduced', 'deprecated', or 'obsoleted'}} +#pragma clang attribute push (__attribute__((objc_bridge_related)), apply_to=function) +// expected-error@-1 {{attribute 'objc_bridge_related' is not supported by '#pragma clang attribute'}} +#pragma clang attribute push (__attribute__((objc_bridge_related(1))), apply_to=function) // expected-error {{expected a related ObjectiveC class name, e.g., 'NSColor'}} #pragma clang attribute push (__attribute__((used)), apply_to=function) // expected-error {{attribute 'used' is not supported by '#pragma clang attribute'}} diff --git a/test/Sema/attr-availability.c b/test/Sema/attr-availability.c index a4b40ff9e0..c4133e3b9b 100644 --- a/test/Sema/attr-availability.c +++ b/test/Sema/attr-availability.c @@ -74,7 +74,7 @@ extern int x; void f8() { int (^b)(int); - b = ^ (int i) __attribute__((availability(macosx,introduced=10.2))) { return 1; }; // expected-warning {{'availability' attribute ignored}} + b = ^ (int i) __attribute__((availability(macosx,introduced=10.2))) { return 1; }; // expected-warning {{'availability' attribute only applies to named declarations}} } extern int x2 __attribute__((availability(macosx,introduced=10.2))); // expected-note {{previous attribute is here}}