Message ID | 20231021180712.370694-1-pinskia@gmail.com |
---|---|
State | New |
Headers | show |
Series | convert_to_complex vs invalid_conversion [PR111903] | expand |
On Sat, Oct 21, 2023 at 8:07 PM Andrew Pinski <pinskia@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 >
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 "" } */ +}