diff options
author | Jakub Jelinek <jakub@redhat.com> | 2006-08-17 13:52:26 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2006-08-17 13:52:26 +0200 |
commit | 343d4b27bf3dfdd3042389dbdaff2afe427864f6 (patch) | |
tree | 1079f5fa46aa27a5d4a1d75e9246bdc01981cd50 /gcc/cgraphunit.c | |
parent | 7ffaaddcdaf19adac105e8481e83ef32c059b641 (diff) | |
download | gcc-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.c | 26 |
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; + } } } } |