From 03b2a15fa54e5ea1d02e86bb036f4692b155151e Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Sat, 21 May 2016 11:46:22 +0200 Subject: [PATCH] * tree.c (array_at_struct_end_p): Look through MEM_REF. From-SVN: r236557 --- gcc/ChangeLog | 4 ++++ gcc/tree.c | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eee44b27972..a4cdb4e1052 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2016-05-21 Jan Hubicka + + * tree.c (array_at_struct_end_p): Look through MEM_REF. + 2016-05-21 Kugan Vivekanandarajah PR middle-end/71179 diff --git a/gcc/tree.c b/gcc/tree.c index 5a1d1676525..83dc7d8bc90 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -13076,9 +13076,28 @@ array_at_struct_end_p (tree ref) ref = TREE_OPERAND (ref, 0); } + tree size = NULL; + + if (TREE_CODE (ref) == MEM_REF + && TREE_CODE (TREE_OPERAND (ref, 0)) == ADDR_EXPR) + { + size = TYPE_SIZE (TREE_TYPE (ref)); + ref = TREE_OPERAND (TREE_OPERAND (ref, 0), 0); + } + /* If the reference is based on a declared entity, the size of the array is constrained by its given domain. (Do not trust commons PR/69368). */ if (DECL_P (ref) + /* Be sure the size of MEM_REF target match. For example: + + char buf[10]; + struct foo *str = (struct foo *)&buf; + + str->trailin_array[2] = 1; + + is valid because BUF allocate enough space. */ + + && (!size || operand_equal_p (DECL_SIZE (ref), size, 0)) && !(flag_unconstrained_commons && TREE_CODE (ref) == VAR_DECL && DECL_COMMON (ref))) return false; -- 2.30.2