cgraph: flatten and same_body aliases [PR96078]

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.
This commit is contained in:
Jason Merrill 2021-02-11 22:01:19 -05:00
parent 9b2084db9f
commit f8e7f3f3f3
3 changed files with 28 additions and 2 deletions

View 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 *

View 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 ();

View File

@ -0,0 +1,9 @@
// PR c++/96078
// { dg-do compile { target c++11 } }
struct A {
[[gnu::flatten]] A() {}
[[gnu::flatten]] ~A() {}
};
A a;