The commit r13-3706-gd0a492faa6478c for correcting the result of
__has_attribute(init_priority) causes a bootstrap failure on hppa64-hpux
because it assumes SUPPORTS_INIT_PRIORITY expands to a simple constant,
but on this target SUPPORTS_INIT_PRIORITY is defined as

  #define SUPPORTS_INIT_PRIORITY (TARGET_GNU_LD ? 1 : 0)

(where TARGET_GNU_LD expands to something in terms of global_options)
which means we can't use this macro to statically exclude the entry
for init_priority when defining the cxx_attribute_table.

So instead of trying to exclude init_priority from the attribute table
for sake of __has_attribute, this patch just makes __has_attribute
handle init_priority specially.

Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for
trunk?  Also sanity checked by artificially defining SUPPORTS_INIT_PRIORITY
to 0.

        PR c++/107638

gcc/c-family/ChangeLog:

        * c-lex.cc (c_common_has_attribute): Return 1 for init_priority
        iff SUPPORTS_INIT_PRIORITY.

gcc/cp/ChangeLog:

        * tree.cc (cxx_attribute_table): Don't conditionally exclude
        the init_priority entry.
        (handle_init_priority_attribute): Remove ATTRIBUTE_UNUSED.
        Return error_mark_node if !SUPPORTS_INIT_PRIORITY.
---
 gcc/c-family/c-lex.cc |  9 +++++++++
 gcc/cp/tree.cc        | 11 +++++++----
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/gcc/c-family/c-lex.cc b/gcc/c-family/c-lex.cc
index 89c65aca28a..2fe562c7ccf 100644
--- a/gcc/c-family/c-lex.cc
+++ b/gcc/c-family/c-lex.cc
@@ -380,6 +380,15 @@ c_common_has_attribute (cpp_reader *pfile, bool std_syntax)
                result = 201907;
              else if (is_attribute_p ("assume", attr_name))
                result = 202207;
+             else if (is_attribute_p ("init_priority", attr_name))
+               {
+                 /* The (non-standard) init_priority attribute is always
+                    included in the attribute table, but we don't want to
+                    advertise the attribute unless the target actually
+                    supports init priorities.  */
+                 result = SUPPORTS_INIT_PRIORITY ? 1 : 0;
+                 attr_name = NULL_TREE;
+               }
            }
          else
            {
diff --git a/gcc/cp/tree.cc b/gcc/cp/tree.cc
index c30bbeb0839..2324c2269fc 100644
--- a/gcc/cp/tree.cc
+++ b/gcc/cp/tree.cc
@@ -5010,10 +5010,8 @@ const struct attribute_spec cxx_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
        affects_type_identity, handler, exclude } */
-#if SUPPORTS_INIT_PRIORITY
   { "init_priority",  1, 1, true,  false, false, false,
     handle_init_priority_attribute, NULL },
-#endif
   { "abi_tag", 1, -1, false, false, false, true,
     handle_abi_tag_attribute, NULL },
   { NULL, 0, 0, false, false, false, false, NULL, NULL }
@@ -5041,13 +5039,19 @@ const struct attribute_spec std_attribute_table[] =
 
 /* Handle an "init_priority" attribute; arguments as in
    struct attribute_spec.handler.  */
-ATTRIBUTE_UNUSED static tree
+static tree
 handle_init_priority_attribute (tree* node,
                                tree name,
                                tree args,
                                int /*flags*/,
                                bool* no_add_attrs)
 {
+  if (!SUPPORTS_INIT_PRIORITY)
+    /* Treat init_priority as an unrecognized attribute (mirroring the
+       result of __has_attribute) if the target doesn't support init
+       priorities.  */
+    return error_mark_node;
+
   tree initp_expr = TREE_VALUE (args);
   tree decl = *node;
   tree type = TREE_TYPE (decl);
@@ -5105,7 +5109,6 @@ handle_init_priority_attribute (tree* node,
         pri);
     }
 
-  gcc_assert (SUPPORTS_INIT_PRIORITY);
   SET_DECL_INIT_PRIORITY (decl, pri);
   DECL_HAS_INIT_PRIORITY_P (decl) = 1;
   return NULL_TREE;
-- 
2.38.1.420.g319605f8f0

Reply via email to