From d3d4a52a70f2021b3d84cb35f66ba88190e6b5d3 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 22 Feb 2018 09:29:56 +0100 Subject: [PATCH] re PR c++/84502 (Argument corruption when passing empty templated struct) PR target/84502 * stor-layout.c (finalize_type_size): Propagate TYPE_EMPTY_P flag to all type variants. * g++.dg/torture/pr84502.C: New test. From-SVN: r257892 --- gcc/ChangeLog | 4 ++++ gcc/stor-layout.c | 8 +++++--- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/torture/pr84502.C | 20 ++++++++++++++++++++ 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr84502.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 914d6cba248..07dd795476d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2018-02-22 Jakub Jelinek + PR target/84502 + * stor-layout.c (finalize_type_size): Propagate TYPE_EMPTY_P flag + to all type variants. + PR tree-optimization/84503 * gimple-ssa-store-merging.c (merged_store_group::merge_into): Compute width as info->bitpos + info->bitsize - start. diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index 5fdf81a9a25..a4eeff18ec0 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -1883,6 +1883,9 @@ finalize_type_size (tree type) && TREE_CODE (TYPE_SIZE_UNIT (type)) != INTEGER_CST) TYPE_SIZE_UNIT (type) = variable_size (TYPE_SIZE_UNIT (type)); + /* Handle empty records as per the x86-64 psABI. */ + TYPE_EMPTY_P (type) = targetm.calls.empty_record_p (type); + /* Also layout any other variants of the type. */ if (TYPE_NEXT_VARIANT (type) || type != TYPE_MAIN_VARIANT (type)) @@ -1895,6 +1898,7 @@ finalize_type_size (tree type) unsigned int precision = TYPE_PRECISION (type); unsigned int user_align = TYPE_USER_ALIGN (type); machine_mode mode = TYPE_MODE (type); + bool empty_p = TYPE_EMPTY_P (type); /* Copy it into all variants. */ for (variant = TYPE_MAIN_VARIANT (type); @@ -1911,11 +1915,9 @@ finalize_type_size (tree type) SET_TYPE_ALIGN (variant, valign); TYPE_PRECISION (variant) = precision; SET_TYPE_MODE (variant, mode); + TYPE_EMPTY_P (variant) = empty_p; } } - - /* Handle empty records as per the x86-64 psABI. */ - TYPE_EMPTY_P (type) = targetm.calls.empty_record_p (type); } /* Return a new underlying object for a bitfield started with FIELD. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 19b85bb350c..681971b208e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2018-02-22 Jakub Jelinek + PR target/84502 + * g++.dg/torture/pr84502.C: New test. + PR tree-optimization/84503 * gcc.dg/pr84503-1.c: New test. * gcc.dg/pr84503-2.c: New test. diff --git a/gcc/testsuite/g++.dg/torture/pr84502.C b/gcc/testsuite/g++.dg/torture/pr84502.C new file mode 100644 index 00000000000..befde4e1f0c --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr84502.C @@ -0,0 +1,20 @@ +// PR target/84502 +// { dg-do run } + +template +struct A { }; +using X = A; + +void +foo (X, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8) +{ + if (a1 != 0 || a2 != 1 || a3 != 2 || a4 != 3 + || a5 != 4 || a6 != 5 || a7 != 6 || a8 != 7) + __builtin_abort (); +} + +int +main () +{ + foo (X{}, 0, 1, 2, 3, 4, 5, 6, 7); +} -- 2.30.2