https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80171

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot 
gnu.org

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
On trunk:

#1  0x000000000173ef58 in generic_simplify_VIEW_CONVERT_EXPR (loc=0, 
    code=VIEW_CONVERT_EXPR, type=<integer_type 0x7ffff6a00f18 size_t>, 
    op0=<tree 0x0>) at generic-match.c:9836
9836        if ((0 && useless_type_conversion_p (type, TREE_TYPE
(captures[0]))) || (1 && type == TREE_TYPE (captures[0])))
(gdb) p captures[0]
$1 = (tree_node *) 0x0

#4  0x0000000000e05840 in fold_ctor_reference (
    type=<integer_type 0x7ffff6a00f18 size_t>, 
    ctor=<addr_expr 0x7ffff677ac20>, offset=0, size=64, 
    from_decl=<var_decl 0x7ffff678a000
_ZTVN5padis12isislistener3tlv2te25IPv4NeighborAddressSubTlvE>)
    at /space/rguenther/src/svn/gcc-7-branch/gcc/gimple-fold.c:6242
6242          ret = fold_unary (VIEW_CONVERT_EXPR, type, ret);
(gdb) p ret
$2 = <tree 0x0>


Simple fix (further reduced testcase appreciated)

Index: gcc/gimple-fold.c
===================================================================
--- gcc/gimple-fold.c   (revision 246437)
+++ gcc/gimple-fold.c   (working copy)
@@ -6239,9 +6239,12 @@ fold_ctor_reference (tree type, tree cto
       && !compare_tree_int (TYPE_SIZE (TREE_TYPE (ctor)), size))
     {
       ret = canonicalize_constructor_val (unshare_expr (ctor), from_decl);
-      ret = fold_unary (VIEW_CONVERT_EXPR, type, ret);
       if (ret)
-       STRIP_USELESS_TYPE_CONVERSION (ret);
+       {
+         ret = fold_unary (VIEW_CONVERT_EXPR, type, ret);
+         if (ret)
+           STRIP_USELESS_TYPE_CONVERSION (ret);
+       }
       return ret;
     }
   /* For constants and byte-aligned/sized reads try to go through

Reply via email to