On 06/25/2015 06:44 AM, Marek Polacek wrote:
On Wed, Jun 24, 2015 at 05:16:33PM +0000, Joseph Myers wrote:
On Wed, 24 Jun 2015, Marek Polacek wrote:
diff --git gcc/c/c-decl.c gcc/c/c-decl.c
index fc1fdf9..ab54db9 100644
--- gcc/c/c-decl.c
+++ gcc/c/c-decl.c
@@ -2650,9 +2650,8 @@ merge_decls (tree newdecl, tree olddecl, tree newtype,
tree oldtype)
tree_code_size (TREE_CODE (olddecl)) - sizeof (struct
tree_decl_common));
olddecl->decl_with_vis.symtab_node = snode;
- if ((DECL_EXTERNAL (olddecl)
- || TREE_PUBLIC (olddecl)
- || TREE_STATIC (olddecl))
+ if ((is_global_var (olddecl)
+ || TREE_PUBLIC (olddecl))
&& DECL_SECTION_NAME (newdecl) != NULL)
set_decl_section_name (olddecl, DECL_SECTION_NAME (newdecl));
At least this case covers both FUNCTION_DECL and VAR_DECL. If
is_global_var is appropriate for functions as well as variables, I think
it should be renamed (and have its comment updated to explain what it
means for functions).
You raise a good point. After fair amount of investigating, I don't think
is_global_var is appropriate for functions. (DECL_EXTERNAL || TREE_STATIC)
for a function is only false for weird cases such as an inline function
definition followed by redeclaring this function with noinline attribute, i.e.:
inline void a (void) {}
void a (void) __attribute__ ((noinline));
void
b ()
{
a ();
}
is_global_var with a FUNCTION_DECL is only called in tree-ssa-structalias.c
and it seems like a mistake.
So I propose to commit the following patch, which uses is_global_var only
at places where we're dealing with a variable.
Ok for trunk?
2015-06-25 Marek Polacek <pola...@redhat.com>
* cilk.c (extract_free_variables): Use is_global_var.
* c-decl.c: Use is_global_var throughout.
* c-parser.c: Likewise.
* c-typeck.c: Likewise.
OK.
jeff