diff --git a/gcc/testsuite/gcc.dg/torture/pr117333.c b/gcc/testsuite/gcc.dg/torture/pr117333.c new file mode 100644 index 00000000000..38c1b5493a5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr117333.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ + +struct s +{ + unsigned long ul; + int i; + char ac[]; +}; + +const struct s gs = { 3, -4, "abcdef" }; + +void copy_s(struct s*d, const struct s*s) +{ + *d = *s; +} + +unsigned test(struct s*ps, _Bool direct) +{ + if(direct) + *ps = gs; + else + copy_s(ps, &gs); + return sizeof(*ps); +} + +unsigned size(void) +{ + return sizeof(gs); +} diff --git a/gcc/tree-data-ref.cc b/gcc/tree-data-ref.cc index de234c65e94..1fdfef282c7 100644 --- a/gcc/tree-data-ref.cc +++ b/gcc/tree-data-ref.cc @@ -3004,6 +3004,8 @@ dr_may_alias_p (const struct data_reference *a, const struct data_reference *b, && DR_BASE_ADDRESS (b) && operand_equal_p (DR_BASE_ADDRESS (a), DR_BASE_ADDRESS (b)) && operand_equal_p (DR_OFFSET (a), DR_OFFSET (b)) + && tree_size_a + && tree_size_b && poly_int_tree_p (tree_size_a) && poly_int_tree_p (tree_size_b) && !ranges_maybe_overlap_p (wi::to_poly_widest (DR_INIT (a)),