From 768e3c602bb1210ee8076a2b897704579a10727e Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Wed, 26 Jan 2011 14:03:54 +0000 Subject: [PATCH] re PR tree-optimization/47190 (ICE: in function_and_variable_visibility, at ipa.c:934 with static weakref variable) PR tree-optimization/47190 * cgraphunit.c (process_common_attributes): New function. (process_function_and_variable_attributes): Use it. * gcc.dg/attr-weakref-3.c: New testcase. From-SVN: r169288 --- gcc/ChangeLog | 6 ++++++ gcc/cgraphunit.c | 19 +++++++++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/attr-weakref-3.c | 3 +++ 4 files changed, 33 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/attr-weakref-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dd7e7530047..a358ec7e435 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-01-26 Richard Guenther + + PR tree-optimization/47190 + * cgraphunit.c (process_common_attributes): New function. + (process_function_and_variable_attributes): Use it. + 2011-01-26 Richard Guenther PR lto/47423 diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 92e5aa95461..2eb3285290b 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -791,6 +791,23 @@ cgraph_analyze_function (struct cgraph_node *node) current_function_decl = save; } +/* Process attributes common for vars and functions. */ + +static void +process_common_attributes (tree decl) +{ + tree weakref = lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)); + + if (weakref && !lookup_attribute ("alias", DECL_ATTRIBUTES (decl))) + { + warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wattributes, + "% attribute should be accompanied with" + " an % attribute"); + DECL_WEAK (decl) = 0; + remove_attribute ("weakref", DECL_ATTRIBUTES (decl)); + } +} + /* Look for externally_visible and used attributes and mark cgraph nodes accordingly. @@ -843,6 +860,7 @@ process_function_and_variable_attributes (struct cgraph_node *first, else if (node->local.finalized) cgraph_mark_needed_node (node); } + process_common_attributes (decl); } for (vnode = varpool_nodes; vnode != first_var; vnode = vnode->next) { @@ -869,6 +887,7 @@ process_function_and_variable_attributes (struct cgraph_node *first, else if (vnode->finalized) varpool_mark_needed_node (vnode); } + process_common_attributes (decl); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 284d6509c44..2d7d765dc15 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-01-26 Richard Guenther + + PR tree-optimization/47190 + * gcc.dg/attr-weakref-3.c: New testcase. + 2011-01-26 Dave Korn PR c++/43601 diff --git a/gcc/testsuite/gcc.dg/attr-weakref-3.c b/gcc/testsuite/gcc.dg/attr-weakref-3.c new file mode 100644 index 00000000000..fe4462a8a3a --- /dev/null +++ b/gcc/testsuite/gcc.dg/attr-weakref-3.c @@ -0,0 +1,3 @@ +/* { dg-do compile } */ +/* { dg-require-weak "" } */ +static int i __attribute__ ((weakref)); /* { dg-warning "attribute should be accompanied" } */