From patchwork Tue Apr 27 11:20:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 1470650 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=WF9F5KsS; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4FTzpL1SSzz9sWH for ; Tue, 27 Apr 2021 21:20:41 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A0614389442B; Tue, 27 Apr 2021 11:20:39 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A0614389442B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1619522439; bh=DKgQgkVvW0NQK0KLh22jikuvJg/SodR3zQcfzYUaahQ=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=WF9F5KsSrQgGwMOSUdS/TzABz2yTkH/GGug+MU0K0WVlBXbRYfHfyI52rYeIntmpA MMFityIes3WBOP7RuXxJUro5ngaZzrA1l9fzOF2JZ8Zzp1GMDrXa0wOsns6DetuY2F gig9Lm1dcvrsOmUEw5RsUEm25y9PhblZHaQelPVc= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id C4A0D3894425 for ; Tue, 27 Apr 2021 11:20:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org C4A0D3894425 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 54A13D6E for ; Tue, 27 Apr 2021 04:20:35 -0700 (PDT) Received: from localhost (e121540-lin.manchester.arm.com [10.32.98.126]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id EAD5B3F694 for ; Tue, 27 Apr 2021 04:20:34 -0700 (PDT) To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, richard.sandiford@arm.com Subject: [committed] aarch64: Handle SVE attributes in comp_type_attributes [PR100270] Date: Tue, 27 Apr 2021 12:20:33 +0100 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Richard Sandiford via Gcc-patches From: Richard Sandiford Reply-To: Richard Sandiford Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" Even though "SVE type" and "SVE sizeless type" are marked as affecting type identity, the middle end doesn't truly believe it unless we also handle them in comp_type_attributes. Tested on aarch64-linux-gnu. Pushed to trunk so far, but I'll backport to GCC 11 too. The GCC 10 version will look different. Richard gcc/ PR target/100270 * config/aarch64/aarch64.c (aarch64_comp_type_attributes): Handle SVE attributes. gcc/testsuite/ PR target/100270 * gcc.target/aarch64/sve/acle/general-c/pr100270_1.c: New test. * gcc.target/aarch64/sve/acle/general-c/sizeless-2.c: Change expected error message when subtracting pointers to different vector types. Expect warnings when mixing them elsewhere. * gcc.target/aarch64/sve/acle/general/attributes_7.c: Remove XFAILs. Tweak error messages for some cases. --- gcc/config/aarch64/aarch64.c | 4 + .../aarch64/sve/acle/general-c/pr100270_1.c | 103 ++++++++++++++++++ .../aarch64/sve/acle/general-c/sizeless-2.c | 36 +++--- .../aarch64/sve/acle/general/attributes_7.c | 72 ++++++------ 4 files changed, 166 insertions(+), 49 deletions(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/pr100270_1.c diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 12625a4bee3..dbaf6fbe4c8 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -25173,6 +25173,10 @@ aarch64_comp_type_attributes (const_tree type1, const_tree type2) return 0; if (!check_attr ("Advanced SIMD type")) return 0; + if (!check_attr ("SVE type")) + return 0; + if (!check_attr ("SVE sizeless type")) + return 0; return 1; } diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/pr100270_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/pr100270_1.c new file mode 100644 index 00000000000..05232d79325 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/pr100270_1.c @@ -0,0 +1,103 @@ +/* { dg-options "-msve-vector-bits=256" } */ + +#include + +typedef svint32_t vls_svint32_t __attribute__((arm_sve_vector_bits(256))); +typedef svuint32_t vls_svuint32_t __attribute__((arm_sve_vector_bits(256))); + +typedef int32_t gnu_svint32_t __attribute__((vector_size(32))); +typedef uint32_t gnu_svuint32_t __attribute__((vector_size(32))); + +#define X_gnu_svint32_t 1 +#define X_gnu_svuint32_t 2 +#define X_vls_svint32_t 3 +#define X_vls_svuint32_t 4 + +#define CHECK(T) T: X_##T + +#define CHECK_TYPE(EXPR, TYPE) \ + do { \ + int x[_Generic (EXPR, \ + CHECK (gnu_svint32_t), \ + CHECK (gnu_svuint32_t), \ + CHECK (vls_svint32_t), \ + CHECK (vls_svuint32_t), \ + default : 0) == X_##TYPE ? 1 : -1]; \ + } while (0) + +void +f (gnu_svint32_t sg, gnu_svuint32_t ug, vls_svint32_t sn, vls_svuint32_t un, int c) +{ + CHECK_TYPE (sg, gnu_svint32_t); + CHECK_TYPE (ug, gnu_svuint32_t); + CHECK_TYPE (sn, vls_svint32_t); + CHECK_TYPE (un, vls_svuint32_t); + + CHECK_TYPE (sg + 1, gnu_svint32_t); + CHECK_TYPE (ug + 1, gnu_svuint32_t); + CHECK_TYPE (sn + 1, vls_svint32_t); + CHECK_TYPE (un + 1, vls_svuint32_t); + + CHECK_TYPE (1 + sg, gnu_svint32_t); + CHECK_TYPE (1 + ug, gnu_svuint32_t); + CHECK_TYPE (1 + sn, vls_svint32_t); + CHECK_TYPE (1 + un, vls_svuint32_t); + + CHECK_TYPE (sg + sg, gnu_svint32_t); + CHECK_TYPE (ug + ug, gnu_svuint32_t); + CHECK_TYPE (sn + sn, vls_svint32_t); + CHECK_TYPE (un + un, vls_svuint32_t); + + /* Traditional behavior for mixed signs is to pick the signedness of the + first operand. We don't have any Arm-specific reason for preferring that + behavior. */ + CHECK_TYPE (sg + ug, gnu_svint32_t); + CHECK_TYPE (ug + sg, gnu_svuint32_t); + CHECK_TYPE (sn + un, vls_svint32_t); + CHECK_TYPE (un + sn, vls_svuint32_t); + + CHECK_TYPE (c ? sg + sg : sg, gnu_svint32_t); + CHECK_TYPE (c ? ug + ug : ug, gnu_svuint32_t); + CHECK_TYPE (c ? sn + sn : sn, vls_svint32_t); + CHECK_TYPE (c ? un + un : un, vls_svuint32_t); + + CHECK_TYPE (c ? sg + 1 : sg, gnu_svint32_t); + CHECK_TYPE (c ? ug + 1 : ug, gnu_svuint32_t); + CHECK_TYPE (c ? sn + 1 : sn, vls_svint32_t); + CHECK_TYPE (c ? un + 1 : un, vls_svuint32_t); + + CHECK_TYPE (c ? 1 + sg : sg, gnu_svint32_t); + CHECK_TYPE (c ? 1 + ug : ug, gnu_svuint32_t); + CHECK_TYPE (c ? 1 + sn : sn, vls_svint32_t); + CHECK_TYPE (c ? 1 + un : un, vls_svuint32_t); + + CHECK_TYPE (c ? sg : sg + sg, gnu_svint32_t); + CHECK_TYPE (c ? ug : ug + ug, gnu_svuint32_t); + CHECK_TYPE (c ? sn : sn + sn, vls_svint32_t); + CHECK_TYPE (c ? un : un + un, vls_svuint32_t); + + CHECK_TYPE (c ? sg : sg + 1, gnu_svint32_t); + CHECK_TYPE (c ? ug : ug + 1, gnu_svuint32_t); + CHECK_TYPE (c ? sn : sn + 1, vls_svint32_t); + CHECK_TYPE (c ? un : un + 1, vls_svuint32_t); + + CHECK_TYPE (c ? sg : 1 + sg, gnu_svint32_t); + CHECK_TYPE (c ? ug : 1 + ug, gnu_svuint32_t); + CHECK_TYPE (c ? sn : 1 + sn, vls_svint32_t); + CHECK_TYPE (c ? un : 1 + un, vls_svuint32_t); + + CHECK_TYPE (c ? sg + sg : sg + sg, gnu_svint32_t); + CHECK_TYPE (c ? ug + ug : ug + ug, gnu_svuint32_t); + CHECK_TYPE (c ? sn + sn : sn + sn, vls_svint32_t); + CHECK_TYPE (c ? un + un : un + un, vls_svuint32_t); + + CHECK_TYPE (c ? sg + sg : sg + 1, gnu_svint32_t); + CHECK_TYPE (c ? ug + ug : ug + 1, gnu_svuint32_t); + CHECK_TYPE (c ? sn + sn : sn + 1, vls_svint32_t); + CHECK_TYPE (c ? un + un : un + 1, vls_svuint32_t); + + CHECK_TYPE (c ? 1 + sg : sg + sg, gnu_svint32_t); + CHECK_TYPE (c ? 1 + ug : ug + ug, gnu_svuint32_t); + CHECK_TYPE (c ? 1 + sn : sn + sn, vls_svint32_t); + CHECK_TYPE (c ? 1 + un : un + un, vls_svuint32_t); +} diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/sizeless-2.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/sizeless-2.c index 3af36de9994..c575492c1f8 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/sizeless-2.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/sizeless-2.c @@ -106,8 +106,8 @@ statements (int n) /* Pointer assignment. */ - gnu_sc_ptr = sve_sc_ptr; - sve_sc_ptr = gnu_sc_ptr; + gnu_sc_ptr = sve_sc_ptr; /* { dg-warning {incompatible pointer type} } */ + sve_sc_ptr = gnu_sc_ptr; /* { dg-warning {incompatible pointer type} } */ /* Pointer arithmetic. */ @@ -120,8 +120,8 @@ statements (int n) sve_sc_ptr -= 0; /* { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } */ sve_sc_ptr -= 1; /* { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } */ sve_sc_ptr - sve_sc_ptr; /* { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } */ - gnu_sc_ptr - sve_sc_ptr; /* { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } */ - sve_sc_ptr - gnu_sc_ptr; /* { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } */ + gnu_sc_ptr - sve_sc_ptr; /* { dg-error {invalid operands to binary -} } */ + sve_sc_ptr - gnu_sc_ptr; /* { dg-error {invalid operands to binary -} } */ sve_sc1 = sve_sc_ptr[0]; /* { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } */ sve_sc1 = sve_sc_ptr[1]; /* { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } */ @@ -133,18 +133,18 @@ statements (int n) sve_sc_ptr <= &sve_sc1; sve_sc_ptr > &sve_sc1; sve_sc_ptr >= &sve_sc1; - gnu_sc_ptr == sve_sc_ptr; - gnu_sc_ptr != sve_sc_ptr; - gnu_sc_ptr < sve_sc_ptr; - gnu_sc_ptr <= sve_sc_ptr; - gnu_sc_ptr > sve_sc_ptr; - gnu_sc_ptr >= sve_sc_ptr; - sve_sc_ptr == gnu_sc_ptr; - sve_sc_ptr != gnu_sc_ptr; - sve_sc_ptr < gnu_sc_ptr; - sve_sc_ptr <= gnu_sc_ptr; - sve_sc_ptr > gnu_sc_ptr; - sve_sc_ptr >= gnu_sc_ptr; + gnu_sc_ptr == sve_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + gnu_sc_ptr != sve_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + gnu_sc_ptr < sve_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + gnu_sc_ptr <= sve_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + gnu_sc_ptr > sve_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + gnu_sc_ptr >= sve_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + sve_sc_ptr == gnu_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + sve_sc_ptr != gnu_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + sve_sc_ptr < gnu_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + sve_sc_ptr <= gnu_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + sve_sc_ptr > gnu_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + sve_sc_ptr >= gnu_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ /* Conditional expressions. */ @@ -154,8 +154,8 @@ statements (int n) 0 ? 0 : sve_sc1; /* { dg-error {type mismatch in conditional expression} } */ 0 ?: sve_sc1; /* { dg-error {type mismatch in conditional expression} } */ 0 ? sve_sc_ptr : sve_sc_ptr; - 0 ? sve_sc_ptr : gnu_sc_ptr; - 0 ? gnu_sc_ptr : sve_sc_ptr; + 0 ? sve_sc_ptr : gnu_sc_ptr; /* { dg-warning {pointer type mismatch} } */ + 0 ? gnu_sc_ptr : sve_sc_ptr; /* { dg-warning {pointer type mismatch} } */ /* Generic associations. */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/attributes_7.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/attributes_7.c index e2e74700a01..621666ce6c9 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/attributes_7.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/attributes_7.c @@ -85,19 +85,19 @@ f (int c) (void) (c ? fs8 : ss8); // { dg-error {type mismatch|different types} } (void) (c ? fs8 : fs8); - (void) (c ? fs8 : gs8); // { dg-error {type mismatch|different types} "" { xfail c++ } } + (void) (c ? fs8 : gs8); // { dg-error {type mismatch|different types} } (void) (c ? gs8 : ss8); // { dg-error {type mismatch|different types} } - (void) (c ? gs8 : fs8); // { dg-error {type mismatch|different types} "" { xfail c++ } } + (void) (c ? gs8 : fs8); // { dg-error {type mismatch|different types} } (void) (c ? gs8 : gs8); sb = fb; fb = sb; (void) (c ? sb : sb); - (void) (c ? sb : fb); // { dg-error {type mismatch|different types} "" { xfail *-*-* } } + (void) (c ? sb : fb); // { dg-error {type mismatch|different types} "" { xfail c } } - (void) (c ? fb : sb); // { dg-error {type mismatch|different types} "" { xfail *-*-* } } + (void) (c ? fb : sb); // { dg-error {type mismatch|different types} "" { xfail c } } (void) (c ? fb : fb); } @@ -123,24 +123,22 @@ g (int c) void *select __attribute__((unused)); diff = ss8 - ss8; // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } - diff = ss8 - fs8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" { xfail c } } - // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} "bogus" { target c } .-1 } - diff = ss8 - gs8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" { xfail c } } - // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} "bogus" { target c } .-1 } + diff = ss8 - fs8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" } + diff = ss8 - gs8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" } - diff = fs8 - ss8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" { xfail c } } - // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} "bogus" { target c } .-1 } + diff = fs8 - ss8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" } diff = fs8 - fs8; - diff = fs8 - gs8; + diff = fs8 - gs8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" } - diff = gs8 - ss8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" { xfail c } } - // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} "bogus" { target c } .-1 } - diff = gs8 - fs8; + diff = gs8 - ss8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" } + diff = gs8 - fs8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" } diff = gs8 - gs8; - fs8 = ss8; // { dg-error {invalid conversion} "" { xfail c } } + fs8 = ss8; // { dg-error {invalid conversion} "" { target c++ } } + // { dg-warning {incompatible pointer type} "c" { target c } .-1 } fs8 = fs8; - fs8 = gs8; + fs8 = gs8; // { dg-error {invalid conversion} "" { target c++ } } + // { dg-warning {incompatible pointer type} "c" { target c } .-1 } fs8 = su8; // { dg-error {cannot convert} "c++" { target c++ } } // { dg-warning {incompatible pointer type} "c" { target c } .-1 } @@ -150,36 +148,48 @@ g (int c) // { dg-warning {incompatible pointer type} "c" { target c } .-1 } fs8 = ss16; // { dg-error {cannot convert} "c++" { target c++ } } - // { dg-warning {incompatible pointer type} "c" { target c } .-1 } + // { dg-warning {incompatible pointer type} "c" { target c } .-1 } fs8 = fs16; // { dg-error {cannot convert} "c++" { target c++ } } - // { dg-warning {incompatible pointer type} "c" { target c } .-1 } + // { dg-warning {incompatible pointer type} "c" { target c } .-1 } fs8 = gs16; // { dg-error {cannot convert} "c++" { target c++ } } - // { dg-warning {incompatible pointer type} "c" { target c } .-1 } + // { dg-warning {incompatible pointer type} "c" { target c } .-1 } select = c ? ss8 : ss8; - select = c ? ss8 : fs8; // { dg-error {distinct pointer types} "" { xfail c } } - select = c ? ss8 : gs8; // { dg-error {distinct pointer types} "" { xfail c } } + select = c ? ss8 : fs8; // { dg-error {distinct pointer types} "" { target c++ } } + // { dg-warning {pointer type mismatch} "c" { target c } .-1 } + select = c ? ss8 : gs8; // { dg-error {distinct pointer types} "" { target c++ } } + // { dg-warning {pointer type mismatch} "c" { target c } .-1 } - select = c ? fs8 : ss8; // { dg-error {distinct pointer types} "" { xfail c } } + select = c ? fs8 : ss8; // { dg-error {distinct pointer types} "" { target c++ } } + // { dg-warning {pointer type mismatch} "c" { target c } .-1 } select = c ? fs8 : fs8; - select = c ? fs8 : gs8; // { dg-error {distinct pointer types} "" { xfail *-*-* } } + select = c ? fs8 : gs8; // { dg-error {distinct pointer types} "" { target c++ } } + // { dg-warning {pointer type mismatch} "c" { target c } .-1 } - select = c ? gs8 : ss8; // { dg-error {distinct pointer types} "" { xfail c } } - select = c ? gs8 : fs8; // { dg-error {distinct pointer types} "" { xfail *-*-* } } + select = c ? gs8 : ss8; // { dg-error {distinct pointer types} "" { target c++ } } + // { dg-warning {pointer type mismatch} "c" { target c } .-1 } + select = c ? gs8 : fs8; // { dg-error {distinct pointer types} "" { target c++ } } + // { dg-warning {pointer type mismatch} "c" { target c } .-1 } select = c ? gs8 : gs8; diff = sb - sb; // { dg-error {arithmetic on pointer to SVE type 'svbool_t'} } - diff = sb - fb; // { dg-error {arithmetic on pointer to SVE type 'svbool_t'} } + diff = sb - fb; // { dg-error {invalid operands} "" { target c++ } } + // { dg-error {arithmetic on pointer to SVE type 'svbool_t'} "c" { target c } .-1 } - diff = fb - sb; // { dg-error {arithmetic on pointer to SVE type 'svbool_t'} } + diff = fb - sb; // { dg-error {invalid operands} "" { target c++ } } + // { dg-error {arithmetic on pointer to SVE type 'svbool_t'} "c" { target c } .-1 } diff = fb - fb; - sb = fb; - fb = sb; + sb = fb; // { dg-error {invalid conversion} "" { target c++ } } + // { dg-warning {incompatible pointer type} "c" { target c xfail c } .-1 } + fb = sb; // { dg-error {invalid conversion} "" { target c++ } } + // { dg-warning {incompatible pointer type} "c" { target c xfail c } .-1 } select = c ? sb : sb; - select = c ? sb : fb; // { dg-error {type mismatch|different types} "" { xfail *-*-* } } + select = c ? sb : fb; // { dg-error {distinct pointer types} "" { target c++ } } + // { dg-warning {pointer type mismatch} "c" { target c xfail c } .-1 } - select = c ? fb : sb; // { dg-error {type mismatch|different types} "" { xfail *-*-* } } + select = c ? fb : sb; // { dg-error {distinct pointer types} "" { target c++ } } + // { dg-warning {pointer type mismatch} "c" { target c xfail c } .-1 } select = c ? fb : fb; }