This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Fix g++.dg/cpp0x/static_assert9.C failure


Hi!

On Sat, 20 Sep 2014 01:59:25 +0200, Jan Hubicka <hubicka@ucw.cz> wrote:
> Bootstrapped/regtested x86_64-linux, comitted.

(In r215409.)

> 	PR c++/61825
> 	* c-family/c-common.c (handle_alias_ifunc_attribute): Check
> 	that visibility change is possible
> 	(handle_weakref_attribute): Likewise.
> 	* cgraph.h (symtab_node): Add method get_create and
> 	field refuse_visibility_changes.
> 	(symtab_node::get_create): New method.
> 	* fold-const.c (tree_single_nonzero_warnv_p): Use get_create.
> 	* varasm.c (mark_weak): Verify that visibility change is
> 	possible.
> 
> 	* gcc.dg/tree-ssa/nonzero-1.c: Require error to be output.

This patch is causing <https://gcc.gnu.org/PR63325> and similar issues,
with --enable-checking=fold.  Could you please have a look?

> Index: c-family/c-common.c
> ===================================================================
> --- c-family/c-common.c	(revision 215401)
> +++ c-family/c-common.c	(working copy)
> @@ -7757,6 +7757,19 @@ handle_alias_ifunc_attribute (bool is_al
>        *no_add_attrs = true;
>      }
>  
> +  if (decl_in_symtab_p (*node))
> +    {
> +      struct symtab_node *n = symtab_node::get (decl);
> +      if (n && n->refuse_visibility_changes)
> +	{
> +	  if (is_alias)
> +	    error ("%+D declared alias after being used", decl);
> +	  else
> +	    error ("%+D declared ifunc after being used", decl);
> +	}
> +    }
> +
> +
>    return NULL_TREE;
>  }
>  
> @@ -7833,6 +7846,13 @@ handle_weakref_attribute (tree *node, tr
>        DECL_WEAK (*node) = 1;
>      }
>  
> +  if (decl_in_symtab_p (*node))
> +    {
> +      struct symtab_node *n = symtab_node::get (*node);
> +      if (n && n->refuse_visibility_changes)
> +	error ("%+D declared weakref after being used", *node);
> +    }
> +
>    return NULL_TREE;
>  }
>  
> Index: cgraph.h
> ===================================================================
> --- cgraph.h	(revision 215401)
> +++ cgraph.h	(working copy)
> @@ -346,6 +346,10 @@ public:
>      return decl->decl_with_vis.symtab_node;
>    }
>  
> +  /* Try to find a symtab node for declaration DECL and if it does not
> +     exist or if it corresponds to an inline clone, create a new one.  */
> +  static inline symtab_node * get_create (tree node);
> +
>    /* Return the cgraph node that has ASMNAME for its DECL_ASSEMBLER_NAME.
>       Return NULL if there's no such node.  */
>    static symtab_node *get_for_asmname (const_tree asmname);
> @@ -394,7 +398,9 @@ public:
>    unsigned analyzed : 1;
>    /* Set for write-only variables.  */
>    unsigned writeonly : 1;
> -
> +  /* Visibility of symbol was used for further optimization; do not
> +     permit further changes.  */
> +  unsigned refuse_visibility_changes : 1;
>  
>    /*** Visibility and linkage flags.  ***/
>  
> @@ -2519,4 +2525,12 @@ cgraph_node::mark_force_output (void)
>    gcc_checking_assert (!global.inlined_to);
>  }
>  
> +inline symtab_node * symtab_node::get_create (tree node)
> +{
> +  if (TREE_CODE (node) == VAR_DECL)
> +    return varpool_node::get_create (node);
> +  else
> +    return cgraph_node::get_create (node);
> +}
> +
>  #endif  /* GCC_CGRAPH_H  */
> Index: fold-const.c
> ===================================================================
> --- fold-const.c	(revision 215401)
> +++ fold-const.c	(working copy)
> @@ -15850,7 +15850,7 @@ tree_single_nonzero_warnv_p (tree t, boo
>  	  {
>  	    struct symtab_node *symbol;
>  
> -	    symbol = symtab_node::get (base);
> +	    symbol = symtab_node::get_create (base);
>  	    if (symbol)
>  	      return symbol->nonzero_address ();
>  	    else
> Index: testsuite/gcc.dg/tree-ssa/nonzero-1.c
> ===================================================================
> --- testsuite/gcc.dg/tree-ssa/nonzero-1.c	(revision 215401)
> +++ testsuite/gcc.dg/tree-ssa/nonzero-1.c	(working copy)
> @@ -1,11 +1,8 @@
>  /* { dg-do compile } */
> -/* { dg-options "-O2 -fdump-tree-optimized" } */
> -extern int a;
> +/* { dg-options "-O2" } */
> +extern int a; /* { dg-error "declared weak after being used" } */
>  t()
>  {
>    return &a!=0;
>  }
>  extern int a __attribute__ ((weak));
> -
> -/* { dg-final { scan-tree-dump-not "return 1" "optimized"} } */
> -/* { dg-final { cleanup-tree-dump "optimized" } } */
> Index: varasm.c
> ===================================================================
> --- varasm.c	(revision 215401)
> +++ varasm.c	(working copy)
> @@ -5230,6 +5230,12 @@ output_constructor (tree exp, unsigned H
>  static void
>  mark_weak (tree decl)
>  {
> +  if (DECL_WEAK (decl))
> +    return;
> +
> +  struct symtab_node *n = symtab_node::get (decl);
> +  if (n && n->refuse_visibility_changes)
> +    error ("%+D declared weak after being used", decl);
>    DECL_WEAK (decl) = 1;
>  
>    if (DECL_RTL_SET_P (decl)
> Index: symtab.c
> ===================================================================
> --- symtab.c	(revision 215401)
> +++ symtab.c	(working copy)
> @@ -1811,9 +1811,9 @@ bool
>  symtab_node::nonzero_address ()
>  {
>    /* Weakrefs may be NULL when their target is not defined.  */
> -  if (this->alias && this->weakref)
> +  if (alias && weakref)
>      {
> -      if (this->analyzed)
> +      if (analyzed)
>  	{
>  	  symtab_node *target = ultimate_alias_target ();
>  
> @@ -1828,7 +1828,7 @@ symtab_node::nonzero_address ()
>  	     could be useful to eliminate the NULL pointer checks in LTO
>  	     programs.  */
>  	  if (target->definition && !DECL_EXTERNAL (target->decl))
> -	    return true;
> +	      return true;
>  	  if (target->resolution != LDPR_UNKNOWN
>  	      && target->resolution != LDPR_UNDEF
>  	      && flag_delete_null_pointer_checks)
> @@ -1847,22 +1847,28 @@ symtab_node::nonzero_address ()
>       Those are handled by later check for definition.
>  
>       When parsing, beware the cases when WEAK attribute is added later.  */
> -  if (!DECL_WEAK (this->decl)
> -      && flag_delete_null_pointer_checks
> -      && symtab->state > PARSING)
> -    return true;
> +  if (!DECL_WEAK (decl)
> +      && flag_delete_null_pointer_checks)
> +    {
> +      refuse_visibility_changes = true;
> +      return true;
> +    }
>  
>    /* If target is defined and not extern, we know it will be output and thus
>       it will bind to non-NULL.
>       Play safe for flag_delete_null_pointer_checks where weak definition maye
>       be re-defined by NULL.  */
> -  if (this->definition && !DECL_EXTERNAL (this->decl)
> -      && (flag_delete_null_pointer_checks || !DECL_WEAK (this->decl)))
> -    return true;
> +  if (definition && !DECL_EXTERNAL (decl)
> +      && (flag_delete_null_pointer_checks || !DECL_WEAK (decl)))
> +    {
> +      if (!DECL_WEAK (decl))
> +        refuse_visibility_changes = true;
> +      return true;
> +    }
>  
>    /* As the last resort, check the resolution info.  */
> -  if (this->resolution != LDPR_UNKNOWN
> -      && this->resolution != LDPR_UNDEF
> +  if (resolution != LDPR_UNKNOWN
> +      && resolution != LDPR_UNDEF
>        && flag_delete_null_pointer_checks)
>      return true;
>    return false;


GrÃÃe,
 Thomas

Attachment: pgp8E1Rd1L2fC.pgp
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]