From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1314) id 23D323858C66; Mon, 23 Oct 2023 10:55:42 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 23D323858C66 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1698058542; bh=jDX+q1V+OmaNv+5Ntuujacvp5+9wpEFmrH9/uifcYco=; h=From:To:Subject:Date:From; b=HdXo1q1D77S07wRqL30sxt2nTm0QNGHxBJq2wkqV2QOODnXx/QSt1U7bnLbc9RGyr 3rUEbNO6ESJ1wkJFYxQgt09kSY2xINSuNaAeztt4yWJhsMhGyzRoUdu+pP8iIxxiYR KwJVb/db72G15fpZ5nxvB/tUyHc3U7pgLDegquwk= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Andrew Pinski To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-4858] convert_to_complex vs invalid_conversion [PR111903] X-Act-Checkin: gcc X-Git-Author: Andrew Pinski X-Git-Refname: refs/heads/trunk X-Git-Oldrev: d96bd4aade170fcd86f5f09b68b770dde798e631 X-Git-Newrev: 13c0d052478bb45cc97869f5cc333f269aadb36f Message-Id: <20231023105542.23D323858C66@sourceware.org> Date: Mon, 23 Oct 2023 10:55:42 +0000 (GMT) List-Id: https://gcc.gnu.org/g:13c0d052478bb45cc97869f5cc333f269aadb36f commit r14-4858-g13c0d052478bb45cc97869f5cc333f269aadb36f Author: Andrew Pinski Date: Fri Oct 20 14:47:55 2023 -0700 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. Diff: --- gcc/convert.cc | 9 +++++++-- 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 64b7001843cd..5357609d8f05 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 000000000000..003f82e71469 --- /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 "" } */ +}