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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |hubicka at gcc dot gnu.org

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
C testcase:
extern char v[];

int
foo ()
{
  int k = 0;
  typedef char T[64];
  for (int i = 0; i < 64; i++)
    k += (*(T *) &v[0])[i];
  return k;
}
The bug is in the new
      && (!size || operand_equal_p (DECL_SIZE (ref), size, 0))
We have non-NULL size, but NULL DECL_SIZE (ref).
The question is what do we want to return in that case, before Honza's change
we would just return true, so perhaps we should as well.
E.g.
--- gcc/tree.c.jj       2016-05-22 12:20:38.000000000 +0200
+++ gcc/tree.c  2016-05-25 20:13:54.702338249 +0200
@@ -13079,7 +13079,9 @@ array_at_struct_end_p (tree ref)
   tree size = NULL;

   if (TREE_CODE (ref) == MEM_REF
-      && TREE_CODE (TREE_OPERAND (ref, 0)) == ADDR_EXPR)
+      && TREE_CODE (TREE_OPERAND (ref, 0)) == ADDR_EXPR
+      && DECL_P (TREE_OPERAND (TREE_OPERAND (ref, 0), 0))
+      && DECL_SIZE (TREE_OPERAND (TREE_OPERAND (ref, 0), 0)))
     {
       size = TYPE_SIZE (TREE_TYPE (ref));
       ref = TREE_OPERAND (TREE_OPERAND (ref, 0), 0);
fixes the ICE.

Reply via email to