cgraph: flatten and same_body aliases [PR96078]
authorJason Merrill <jason@redhat.com>
Fri, 12 Feb 2021 03:01:19 +0000 (22:01 -0500)
committerJason Merrill <jason@redhat.com>
Wed, 3 Mar 2021 04:20:43 +0000 (23:20 -0500)
The patch for PR92372 made us start warning about a flatten attribute on an
alias.  But in the case of C++ 'tor base/complete variants, the user didn't
create the alias.  If the alias target also has the attribute, the alias
points to a flattened function, so we shouldn't warn.

gcc/ChangeLog:

PR c++/96078
* cgraphunit.c (process_function_and_variable_attributes): Don't
warn about flatten on an alias if the target also has it.
* cgraph.h (symtab_node::get_alias_target_tree): New.

gcc/testsuite/ChangeLog:

PR c++/96078
* g++.dg/ext/attr-flatten1.C: New test.

gcc/cgraph.h
gcc/cgraphunit.c
gcc/testsuite/g++.dg/ext/attr-flatten1.C [new file with mode: 0644]

index 47b5c02..4a1f899 100644 (file)
@@ -319,6 +319,9 @@ public:
   /* Return node that alias is aliasing.  */
   inline symtab_node *get_alias_target (void);
 
+  /* Return DECL that alias is aliasing.  */
+  inline tree get_alias_target_tree ();
+
   /* Set section for symbol and its aliases.  */
   void set_section (const char *section);
 
@@ -2665,6 +2668,17 @@ symtab_node::get_alias_target (void)
   return ref->referred;
 }
 
+/* Return the DECL (or identifier) that alias is aliasing.  Unlike the above,
+   this works whether or not the alias has been analyzed already.  */
+
+inline tree
+symtab_node::get_alias_target_tree ()
+{
+  if (alias_target)
+    return alias_target;
+  return get_alias_target ()->decl;
+}
+
 /* Return next reachable static symbol with initializer after the node.  */
 
 inline symtab_node *
index b401f08..1c74cee 100644 (file)
@@ -859,8 +859,11 @@ process_function_and_variable_attributes (cgraph_node *first,
       if (node->alias
          && lookup_attribute ("flatten", DECL_ATTRIBUTES (decl)))
        {
-         warning_at (DECL_SOURCE_LOCATION (node->decl), OPT_Wattributes,
-                     "%<flatten%> attribute is ignored on aliases");
+         tree tdecl = node->get_alias_target_tree ();
+         if (!tdecl || !DECL_P (tdecl)
+             || !lookup_attribute ("flatten", DECL_ATTRIBUTES (tdecl)))
+           warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wattributes,
+                       "%<flatten%> attribute is ignored on aliases");
        }
       if (DECL_PRESERVE_P (decl))
        node->mark_force_output ();
diff --git a/gcc/testsuite/g++.dg/ext/attr-flatten1.C b/gcc/testsuite/g++.dg/ext/attr-flatten1.C
new file mode 100644 (file)
index 0000000..5bcbfb6
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/96078
+// { dg-do compile { target c++11 } }
+
+struct A {
+    [[gnu::flatten]] A() {}
+    [[gnu::flatten]] ~A() {}
+};
+
+A a;