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.