diff --git a/gcc/ipa-struct-reorg/ipa-struct-reorg.cc b/gcc/ipa-struct-reorg/ipa-struct-reorg.cc index 1140edd1d73fac20d369b0f645fd57950d100439..f5be8de76914cee42ebdfe9371c9488ea6f6c95d 100644 --- a/gcc/ipa-struct-reorg/ipa-struct-reorg.cc +++ b/gcc/ipa-struct-reorg/ipa-struct-reorg.cc @@ -5566,7 +5566,7 @@ ipa_struct_reorg::check_definition_assign (srdecl *decl, : TYPE_SIZE_UNIT (type->type))) type->mark_escape (escape_non_multiply_size, stmt); - if (TREE_CODE (rhs) == SSA_NAME) + if (TREE_CODE (rhs) == SSA_NAME || TREE_CODE (rhs) == ADDR_EXPR) check_type_and_push (rhs, decl, worklist, stmt); return; } diff --git a/gcc/testsuite/gcc.dg/struct/rf_defined_by_addr_expr.c b/gcc/testsuite/gcc.dg/struct/rf_defined_by_addr_expr.c new file mode 100644 index 0000000000000000000000000000000000000000..65922be8e84fa44640ef433c95735ef4c49f7a1d --- /dev/null +++ b/gcc/testsuite/gcc.dg/struct/rf_defined_by_addr_expr.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ + +struct A { + int a; +}; + +extern unsigned long long offset(); + +int main() { + unsigned char num[16]; + ((struct A*)(num + offset() * 4))->a = 10; + + return num[0]; +} + +/* { dg-final { scan-ipa-dump "struct A(\\\(\[0-9\]*\\\))? has escaped: \"Type escapes a cast to a different pointer\"" "struct_reorg" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/sr_early_void_ptr.c b/gcc/testsuite/gcc.dg/struct/sr_early_void_ptr.c index 5ff166f08081a60189d74cf0e6155165172453d8..c52636925e66412294892b24724b1a5807e058ac 100644 --- a/gcc/testsuite/gcc.dg/struct/sr_early_void_ptr.c +++ b/gcc/testsuite/gcc.dg/struct/sr_early_void_ptr.c @@ -25,4 +25,4 @@ int main() { return 0; } -/* { dg-final { scan-ipa-dump "struct S(\[0-9\]*) has escaped" "struct_reorg" } } */ +/* { dg-final { scan-ipa-dump "struct S(\\\(\[0-9\]*\\\))? has escaped" "struct_reorg" } } */