diff options
author | Andrew Pinski <pinskia@gmail.com> | 2023-10-20 14:47:55 -0700 |
---|---|---|
committer | Andrew Pinski <pinskia@gmail.com> | 2023-10-23 03:54:54 -0700 |
commit | 13c0d052478bb45cc97869f5cc333f269aadb36f (patch) | |
tree | 1a208cc8fbf5ec8585b62b0dd6c9f99eea49d1cd /gcc | |
parent | d96bd4aade170fcd86f5f09b68b770dde798e631 (diff) | |
download | gcc-13c0d052478bb45cc97869f5cc333f269aadb36f.zip gcc-13c0d052478bb45cc97869f5cc333f269aadb36f.tar.gz gcc-13c0d052478bb45cc97869f5cc333f269aadb36f.tar.bz2 |
convert_to_complex vs invalid_conversion [PR111903]
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.
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/convert.cc | 9 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/float16-8.c | 12 |
2 files changed, 19 insertions, 2 deletions
diff --git a/gcc/convert.cc b/gcc/convert.cc index 64b7001..5357609 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 0000000..003f82e --- /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 "" } */ +} |