[clang] 3874277 - Improve docs & test for #pragma clang attribute's any clause; NFC

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Wed Nov 17 05:24:38 PST 2021


Author: Aaron Ballman
Date: 2021-11-17T08:24:26-05:00
New Revision: 3874277f415dca0bb222956983f117a6211c0e39

URL: https://github.com/llvm/llvm-project/commit/3874277f415dca0bb222956983f117a6211c0e39
DIFF: https://github.com/llvm/llvm-project/commit/3874277f415dca0bb222956983f117a6211c0e39.diff

LOG: Improve docs & test for #pragma clang attribute's any clause; NFC

There was some confusion during the discussion of a patch as to whether
`any` can be used to blast an attribute with no subject list onto
basically everything in a program by not specifying a subrule. This
patch adds documentation and tests to make it clear that this situation
is not supported and will be diagnosed.

Added: 
    

Modified: 
    clang/docs/LanguageExtensions.rst
    clang/test/Parser/pragma-attribute.cpp

Removed: 
    


################################################################################
diff  --git a/clang/docs/LanguageExtensions.rst b/clang/docs/LanguageExtensions.rst
index 8f7727e27bf60..60b1ed383a1ff 100644
--- a/clang/docs/LanguageExtensions.rst
+++ b/clang/docs/LanguageExtensions.rst
@@ -3798,7 +3798,8 @@ Multiple match rules can be specified using the ``any`` match rule, as shown
 in the example above. The ``any`` rule applies attributes to all declarations
 that are matched by at least one of the rules in the ``any``. It doesn't nest
 and can't be used inside the other match rules. Redundant match rules or rules
-that conflict with one another should not be used inside of ``any``.
+that conflict with one another should not be used inside of ``any``. Failing to
+specify a rule within the ``any`` rule results in an error.
 
 Clang supports the following match rules:
 

diff  --git a/clang/test/Parser/pragma-attribute.cpp b/clang/test/Parser/pragma-attribute.cpp
index d51f8159c263c..d82eaa3f01b0f 100644
--- a/clang/test/Parser/pragma-attribute.cpp
+++ b/clang/test/Parser/pragma-attribute.cpp
@@ -204,3 +204,9 @@ _Pragma("clang attribute pop");
 #pragma clang attribute pop
 #pragma clang attribute push([[clang::no_destroy]], apply_to = any(variable(is_parameter), variable(unless(is_parameter))))
 #pragma clang attribute pop
+
+// We explicitly do not wish to allow users to blast an attribute to everything
+// using an unconstrained "any", so "any" must have a valid argument list.
+#pragma clang attribute push([[clang::uninitialized]], apply_to=any) // expected-error {{expected '('}}
+#pragma clang attribute push([[clang::uninitialized]], apply_to = any()) // expected-error {{expected an identifier that corresponds to an attribute subject rule}}
+// NB: neither of these need to be popped; they were never successfully pushed.


        


More information about the cfe-commits mailing list