From e1cf56b1d989c6e50b4cd89b2956532588bd9881 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Tue, 18 Jul 2006 06:41:13 +0000 Subject: [PATCH] re PR c/26993 (ICE on invalid code with weakref) PR c/26993 * c-common.c (handle_weakref_attribute): Ignore attribute in the same conditions the alias attribute is ignored. From-SVN: r115545 --- gcc/ChangeLog | 6 ++++++ gcc/c-common.c | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 320f1631c11..65b6b2f9bd0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-07-18 Alexandre Oliva + + PR c/26993 + * c-common.c (handle_weakref_attribute): Ignore attribute in + the same conditions the alias attribute is ignored. + 2006-07-17 Carlos O'Donell * dbxout.c (dbxout_function_end): Do not increment scope_labelno. diff --git a/gcc/c-common.c b/gcc/c-common.c index 61bf12bbb59..9c260615fd7 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -4828,6 +4828,16 @@ handle_weakref_attribute (tree *node, tree ARG_UNUSED (name), tree args, { tree attr = NULL_TREE; + /* We must ignore the attribute when it is associated with + local-scoped decls, since attribute alias is ignored and many + such symbols do not even have a DECL_WEAK field. */ + if (decl_function_context (*node) || current_function_decl) + { + warning (OPT_Wattributes, "%qE attribute ignored", name); + *no_add_attrs = true; + return NULL_TREE; + } + /* The idea here is that `weakref("name")' mutates into `weakref, alias("name")', and weakref without arguments, in turn, implicitly adds weak. */