PR ipa/92799 - ICE on a weakref function definition followed by a declaration
gcc/testsuite/ChangeLog: PR ipa/92799 * gcc.dg/attr-weakref-5.c: New test. gcc/ChangeLog: PR ipa/92799 * cgraphunit.c (process_function_and_variable_attributes): Also complain about weakref function definitions and drop all effects of the attribute.
This commit is contained in:
parent
7a5fffa5ed
commit
3512dc0108
4 changed files with 54 additions and 2 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2020-03-18 Martin Sebor <msebor@redhat.com>
|
||||||
|
|
||||||
|
PR ipa/92799
|
||||||
|
* cgraphunit.c (process_function_and_variable_attributes): Also
|
||||||
|
complain about weakref function definitions and drop all effects
|
||||||
|
of the attribute.
|
||||||
|
|
||||||
2020-03-18 Andre Vieira <andre.simoesdiasvieira@arm.com>
|
2020-03-18 Andre Vieira <andre.simoesdiasvieira@arm.com>
|
||||||
Mihail Ionescu <mihail.ionescu@arm.com>
|
Mihail Ionescu <mihail.ionescu@arm.com>
|
||||||
Srinath Parvathaneni <srinath.parvathaneni@arm.com>
|
Srinath Parvathaneni <srinath.parvathaneni@arm.com>
|
||||||
|
|
|
@ -861,14 +861,23 @@ process_function_and_variable_attributes (cgraph_node *first,
|
||||||
" attribute have effect only on public objects");
|
" attribute have effect only on public objects");
|
||||||
}
|
}
|
||||||
if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))
|
if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))
|
||||||
&& (node->definition && !node->alias))
|
&& node->definition
|
||||||
|
&& (!node->alias || DECL_INITIAL (decl) != error_mark_node))
|
||||||
{
|
{
|
||||||
warning_at (DECL_SOURCE_LOCATION (node->decl), OPT_Wattributes,
|
/* NODE->DEFINITION && NODE->ALIAS is nonzero for valid weakref
|
||||||
|
function declarations; DECL_INITIAL is non-null for invalid
|
||||||
|
weakref functions that are also defined. */
|
||||||
|
warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wattributes,
|
||||||
"%<weakref%> attribute ignored"
|
"%<weakref%> attribute ignored"
|
||||||
" because function is defined");
|
" because function is defined");
|
||||||
DECL_WEAK (decl) = 0;
|
DECL_WEAK (decl) = 0;
|
||||||
DECL_ATTRIBUTES (decl) = remove_attribute ("weakref",
|
DECL_ATTRIBUTES (decl) = remove_attribute ("weakref",
|
||||||
DECL_ATTRIBUTES (decl));
|
DECL_ATTRIBUTES (decl));
|
||||||
|
DECL_ATTRIBUTES (decl) = remove_attribute ("alias",
|
||||||
|
DECL_ATTRIBUTES (decl));
|
||||||
|
node->alias = false;
|
||||||
|
node->weakref = false;
|
||||||
|
node->transparent_alias = false;
|
||||||
}
|
}
|
||||||
else if (lookup_attribute ("alias", DECL_ATTRIBUTES (decl))
|
else if (lookup_attribute ("alias", DECL_ATTRIBUTES (decl))
|
||||||
&& node->definition
|
&& node->definition
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2020-03-18 Martin Sebor <msebor@redhat.com>
|
||||||
|
|
||||||
|
PR ipa/92799
|
||||||
|
* gcc.dg/attr-weakref-5.c: New test.
|
||||||
|
|
||||||
2020-03-18 Andre Vieira <andre.simoesdiasvieira@arm.com>
|
2020-03-18 Andre Vieira <andre.simoesdiasvieira@arm.com>
|
||||||
Mihail Ionescu <mihail.ionescu@arm.com>
|
Mihail Ionescu <mihail.ionescu@arm.com>
|
||||||
Srinath Parvathaneni <srinath.parvathaneni@arm.com>
|
Srinath Parvathaneni <srinath.parvathaneni@arm.com>
|
||||||
|
|
31
gcc/testsuite/gcc.dg/attr-weakref-5.c
Normal file
31
gcc/testsuite/gcc.dg/attr-weakref-5.c
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/* PR middle-end/92799 - ICE on a weakref function definition followed
|
||||||
|
by a declaration
|
||||||
|
{ dg-do compile }
|
||||||
|
{ dg-options "-Wall" } */
|
||||||
|
|
||||||
|
static __attribute__ ((weakref ("bar"))) void f0 (void) { } // { dg-warning "'weakref' attribute ignored because function is defined" }
|
||||||
|
|
||||||
|
extern void f0 (void);
|
||||||
|
|
||||||
|
void* use_f0 (void) { return f0; }
|
||||||
|
|
||||||
|
|
||||||
|
static __attribute__ ((weakref ("bar"))) void f1 (void) { } // { dg-warning "'weakref' attribute ignored because function is defined" }
|
||||||
|
|
||||||
|
static void f1 (void);
|
||||||
|
|
||||||
|
void* use_f1 (void) { return f1; }
|
||||||
|
|
||||||
|
|
||||||
|
static __attribute__ ((weakref ("bar"))) void f2 (void);
|
||||||
|
|
||||||
|
static void f2 (void) { } // { dg-error "redefinition" }
|
||||||
|
|
||||||
|
void* use_f2 (void) { return f2; }
|
||||||
|
|
||||||
|
|
||||||
|
static __attribute__ ((weakref ("bar"))) void f3 (void);
|
||||||
|
|
||||||
|
void f3 (void) { } // { dg-error "redefinition" }
|
||||||
|
|
||||||
|
void* use_f3 (void) { return f3; }
|
Loading…
Add table
Reference in a new issue