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

Reply via email to