aboutsummaryrefslogtreecommitdiff
path: root/gcc/cgraphunit.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2006-08-17 13:52:26 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2006-08-17 13:52:26 +0200
commit343d4b27bf3dfdd3042389dbdaff2afe427864f6 (patch)
tree1079f5fa46aa27a5d4a1d75e9246bdc01981cd50 /gcc/cgraphunit.c
parent7ffaaddcdaf19adac105e8481e83ef32c059b641 (diff)
downloadgcc-343d4b27bf3dfdd3042389dbdaff2afe427864f6.zip
gcc-343d4b27bf3dfdd3042389dbdaff2afe427864f6.tar.gz
gcc-343d4b27bf3dfdd3042389dbdaff2afe427864f6.tar.bz2
re PR c/28744 (externally_visible attribute not effective with prior declaration of symbol.)
PR c/28744 * cgraph.h (struct cgraph_node): Remove externally_visible bitfield. * cgraphunit.c (process_function_and_variable_attributes): Set local.externally_visible rather than externally_visible. PR c/28744 * c-common.c (handle_externally_visible_attribute): First look at TREE_CODE and only if it is function or var decl, check for non-public objects. Don't warn for DECL_EXTERNAL. * cgraphunit.c (process_function_and_variable_attributes): Warn if externally_visible attribute is used on non-public object. * gcc.dg/attr-externally-visible-1.c: New test. * gcc.dg/attr-externally-visible-2.c: New test. * g++.dg/parse/attr-externally-visible-1.C: New test. * g++.dg/parse/attr-externally-visible-2.C: New test. From-SVN: r116222
Diffstat (limited to 'gcc/cgraphunit.c')
-rw-r--r--gcc/cgraphunit.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index ddaecd3..64b3891 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -985,9 +985,16 @@ process_function_and_variable_attributes (struct cgraph_node *first,
}
if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (decl)))
{
- if (node->local.finalized)
- cgraph_mark_needed_node (node);
- node->externally_visible = true;
+ if (! TREE_PUBLIC (node->decl))
+ warning (OPT_Wattributes,
+ "%J%<externally_visible%> attribute have effect only on public objects",
+ node->decl);
+ else
+ {
+ if (node->local.finalized)
+ cgraph_mark_needed_node (node);
+ node->local.externally_visible = true;
+ }
}
}
for (vnode = cgraph_varpool_nodes; vnode != first_var; vnode = vnode->next)
@@ -1001,9 +1008,16 @@ process_function_and_variable_attributes (struct cgraph_node *first,
}
if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (decl)))
{
- if (vnode->finalized)
- cgraph_varpool_mark_needed_node (vnode);
- vnode->externally_visible = true;
+ if (! TREE_PUBLIC (vnode->decl))
+ warning (OPT_Wattributes,
+ "%J%<externally_visible%> attribute have effect only on public objects",
+ vnode->decl);
+ else
+ {
+ if (vnode->finalized)
+ cgraph_varpool_mark_needed_node (vnode);
+ vnode->externally_visible = true;
+ }
}
}
}