d: Fix ICE: verify_gimple_failed (conversion of register to a different size in ...
commitea8ffdcadb388b531adf4772287e7987a82a84b7
authorIain Buclaw <ibuclaw@gdcproject.org>
Sun, 29 Oct 2023 19:13:14 +0000 (29 20:13 +0100)
committerIain Buclaw <ibuclaw@gdcproject.org>
Sun, 29 Oct 2023 19:13:14 +0000 (29 20:13 +0100)
tree4888963b6cc06c6e65b364ff1cb26bfbf04798d6
parente773c6c7009bb35fa50da034f3537448fd36c7f0
d: Fix ICE: verify_gimple_failed (conversion of register to a different size in 'view_convert_expr')

Static arrays in D are passed around by value, rather than decaying to a
pointer.  On x86_64 __builtin_va_list is an exception to this rule, but
semantically it's still treated as a static array.

This makes certain assignment operations fail due a mismatch in types.
As all examples in the test program are rejected by C/C++ front-ends,
these are now errors in D too to be consistent.

PR d/110712

gcc/d/ChangeLog:

* d-codegen.cc (d_build_call): Update call to convert_for_argument.
* d-convert.cc (is_valist_parameter_type): New function.
(check_valist_conversion): New function.
(convert_for_assignment): Update signature.  Add check whether
assigning va_list is permissible.
(convert_for_argument): Likewise.
* d-tree.h (convert_for_assignment): Update signature.
(convert_for_argument): Likewise.
* expr.cc (ExprVisitor::visit (AssignExp *)): Update call to
convert_for_assignment.

gcc/testsuite/ChangeLog:

* gdc.dg/pr110712.d: New test.
gcc/d/d-codegen.cc
gcc/d/d-convert.cc
gcc/d/d-tree.h
gcc/d/expr.cc
gcc/testsuite/gdc.dg/pr110712.d [new file with mode: 0644]