From: Jan Hubicka Date: Thu, 27 Jan 2011 16:16:34 +0000 (+0100) Subject: re PR middle-end/46949 (ICE when weakref is used on a definition (internal compiler... X-Git-Tag: releases/gcc-4.6.0~918 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=779d4b91eb824eb36824dee52bbcfdfe173b2753;p=thirdparty%2Fgcc.git re PR middle-end/46949 (ICE when weakref is used on a definition (internal compiler error: in function_and_variable_visibility, at ipa.c:904)) PR middle-end/46949 * cgraphunit.c (process_common_attributes): Fix use of remove_attribute. (process_function_and_variable_attributes): Check defined weakrefs. * gcc.dg/attr-weakref-4.c: New testcase From-SVN: r169332 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3bee8dd54f63..8f9e86a69c8a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-01-27 Jan Hubicka + + PR middle-end/46949 + * cgraphunit.c (process_common_attributes): Fix use of remove_attribute. + (process_function_and_variable_attributes): Check defined weakrefs. + 2011-01-27 Martin Jambor PR tree-optimization/47228 diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 2245164c3eb8..848eba653040 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -804,7 +804,8 @@ process_common_attributes (tree decl) "% attribute should be accompanied with" " an % attribute"); DECL_WEAK (decl) = 0; - remove_attribute ("weakref", DECL_ATTRIBUTES (decl)); + DECL_ATTRIBUTES (decl) = remove_attribute ("weakref", + DECL_ATTRIBUTES (decl)); } } @@ -860,6 +861,16 @@ process_function_and_variable_attributes (struct cgraph_node *first, else if (node->local.finalized) cgraph_mark_needed_node (node); } + if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)) + && node->local.finalized) + { + warning_at (DECL_SOURCE_LOCATION (node->decl), OPT_Wattributes, + "% attribute ignored" + " because function is defined"); + DECL_WEAK (decl) = 0; + DECL_ATTRIBUTES (decl) = remove_attribute ("weakref", + DECL_ATTRIBUTES (decl)); + } process_common_attributes (decl); } for (vnode = varpool_nodes; vnode != first_var; vnode = vnode->next) @@ -887,6 +898,17 @@ process_function_and_variable_attributes (struct cgraph_node *first, else if (vnode->finalized) varpool_mark_needed_node (vnode); } + if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)) + && vnode->finalized + && DECL_INITIAL (decl)) + { + warning_at (DECL_SOURCE_LOCATION (vnode->decl), OPT_Wattributes, + "% attribute ignored" + " because variable is initialized"); + DECL_WEAK (decl) = 0; + DECL_ATTRIBUTES (decl) = remove_attribute ("weakref", + DECL_ATTRIBUTES (decl)); + } process_common_attributes (decl); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index acaa86287d91..4638e57ce61c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-01-27 Jan Hubicka + + PR middle-end/46949 + * gcc.dg/attr-weakref-4.c: New testcase + 2011-01-27 Martin Jambor PR tree-optimization/47228 diff --git a/gcc/testsuite/gcc.dg/attr-weakref-4.c b/gcc/testsuite/gcc.dg/attr-weakref-4.c new file mode 100644 index 000000000000..df5fdebdc408 --- /dev/null +++ b/gcc/testsuite/gcc.dg/attr-weakref-4.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-require-weak "" } */ +static void __attribute__((weakref("bar"))) foo(void) { } /* { dg-warning "attribute ignored because function is defined" } */ +static int __attribute__((weakref)) a=0; /* { dg-warning "attribute ignored because variable is initialized" } */