Commit 779d4b91 by Jan Hubicka Committed by Jan Hubicka

re PR middle-end/46949 (ICE when weakref is used on a definition (internal…

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
parent e80b21ed
2011-01-27 Jan Hubicka <jh@suse.cz>
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 <mjambor@suse.cz> 2011-01-27 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/47228 PR tree-optimization/47228
......
...@@ -804,7 +804,8 @@ process_common_attributes (tree decl) ...@@ -804,7 +804,8 @@ process_common_attributes (tree decl)
"%<weakref%> attribute should be accompanied with" "%<weakref%> attribute should be accompanied with"
" an %<alias%> attribute"); " an %<alias%> attribute");
DECL_WEAK (decl) = 0; 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, ...@@ -860,6 +861,16 @@ process_function_and_variable_attributes (struct cgraph_node *first,
else if (node->local.finalized) else if (node->local.finalized)
cgraph_mark_needed_node (node); cgraph_mark_needed_node (node);
} }
if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))
&& node->local.finalized)
{
warning_at (DECL_SOURCE_LOCATION (node->decl), OPT_Wattributes,
"%<weakref%> attribute ignored"
" because function is defined");
DECL_WEAK (decl) = 0;
DECL_ATTRIBUTES (decl) = remove_attribute ("weakref",
DECL_ATTRIBUTES (decl));
}
process_common_attributes (decl); process_common_attributes (decl);
} }
for (vnode = varpool_nodes; vnode != first_var; vnode = vnode->next) for (vnode = varpool_nodes; vnode != first_var; vnode = vnode->next)
...@@ -887,6 +898,17 @@ process_function_and_variable_attributes (struct cgraph_node *first, ...@@ -887,6 +898,17 @@ process_function_and_variable_attributes (struct cgraph_node *first,
else if (vnode->finalized) else if (vnode->finalized)
varpool_mark_needed_node (vnode); 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,
"%<weakref%> attribute ignored"
" because variable is initialized");
DECL_WEAK (decl) = 0;
DECL_ATTRIBUTES (decl) = remove_attribute ("weakref",
DECL_ATTRIBUTES (decl));
}
process_common_attributes (decl); process_common_attributes (decl);
} }
} }
......
2011-01-27 Jan Hubicka <jh@suse.cz>
PR middle-end/46949
* gcc.dg/attr-weakref-4.c: New testcase
2011-01-27 Martin Jambor <mjambor@suse.cz> 2011-01-27 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/47228 PR tree-optimization/47228
......
/* { 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" } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment