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:
parent
9b2084db9f
commit
f8e7f3f3f3
14
gcc/cgraph.h
14
gcc/cgraph.h
|
@ -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 *
|
||||
|
|
|
@ -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 ();
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
// PR c++/96078
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
struct A {
|
||||
[[gnu::flatten]] A() {}
|
||||
[[gnu::flatten]] ~A() {}
|
||||
};
|
||||
|
||||
A a;
|
Loading…
Reference in New Issue