On Sat, Oct 21, 2023 at 8:07 PM Andrew Pinski <pins...@gmail.com> wrote: > > convert_to_complex when creating a COMPLEX_EXPR does > not currently check if either the real or imag parts > was not error_mark_node. This later on confuses the gimpilfier > when there was a SAVE_EXPR wrapped around that COMPLEX_EXPR. > The simple fix is after calling convert inside convert_to_complex_1, > check that the either result was an error_operand and return > an error_mark_node in that case. > > Bootstrapped and tested on x86_64-linux-gnu with no regressions.
OK. Richard. > PR c/111903 > > gcc/ChangeLog: > > * convert.cc (convert_to_complex_1): Return > error_mark_node if either convert was an error > when converting from a scalar. > > gcc/testsuite/ChangeLog: > > * gcc.target/i386/float16-8.c: New test. > --- > gcc/convert.cc | 9 +++++++-- > gcc/testsuite/gcc.target/i386/float16-8.c | 12 ++++++++++++ > 2 files changed, 19 insertions(+), 2 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/i386/float16-8.c > > diff --git a/gcc/convert.cc b/gcc/convert.cc > index 80d86fe3708..ac6af7026a7 100644 > --- a/gcc/convert.cc > +++ b/gcc/convert.cc > @@ -1006,8 +1006,13 @@ convert_to_complex_1 (tree type, tree expr, bool > fold_p) > case ENUMERAL_TYPE: > case BOOLEAN_TYPE: > case BITINT_TYPE: > - return build2 (COMPLEX_EXPR, type, convert (subtype, expr), > - convert (subtype, integer_zero_node)); > + { > + tree real = convert (subtype, expr); > + tree imag = convert (subtype, integer_zero_node); > + if (error_operand_p (real) || error_operand_p (imag)) > + return error_mark_node; > + return build2 (COMPLEX_EXPR, type, real, imag); > + } > > case COMPLEX_TYPE: > { > diff --git a/gcc/testsuite/gcc.target/i386/float16-8.c > b/gcc/testsuite/gcc.target/i386/float16-8.c > new file mode 100644 > index 00000000000..003f82e7146 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/float16-8.c > @@ -0,0 +1,12 @@ > +/* { dg-do compile } */ > +/* { dg-options "-mno-sse" } */ > +/* PR c/111903 */ > + > +int i; > +_Float16 f; > +int bar(...); > +void > +foo (void) > +{ > + i /= bar ((_Complex _Float16) f); /* { dg-error "" } */ > +} > -- > 2.39.3 >