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
This commit is contained in:
parent
c5679c37aa
commit
d3d4a52a70
4 changed files with 32 additions and 3 deletions
|
@ -1,5 +1,9 @@
|
|||
2018-02-22 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
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.
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
2018-02-22 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
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.
|
||||
|
|
20
gcc/testsuite/g++.dg/torture/pr84502.C
Normal file
20
gcc/testsuite/g++.dg/torture/pr84502.C
Normal file
|
@ -0,0 +1,20 @@
|
|||
// PR target/84502
|
||||
// { dg-do run }
|
||||
|
||||
template<typename T>
|
||||
struct A { };
|
||||
using X = A<int>;
|
||||
|
||||
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);
|
||||
}
|
Loading…
Add table
Reference in a new issue