From patchwork Thu Nov 28 21:17:33 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Uecker X-Patchwork-Id: 102051 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 85F4B3858C42 for ; Thu, 28 Nov 2024 21:20:02 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 85F4B3858C42 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=tugraz.at header.i=@tugraz.at header.a=rsa-sha256 header.s=mailrelay header.b=jAG/MHZF X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mailrelay.tugraz.at (mailrelay.tugraz.at [129.27.2.202]) by sourceware.org (Postfix) with ESMTPS id E7B2F3858C3A for ; Thu, 28 Nov 2024 21:17:47 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E7B2F3858C3A Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=tugraz.at Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tugraz.at ARC-Filter: OpenARC Filter v1.0.0 sourceware.org E7B2F3858C3A Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=129.27.2.202 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1732828668; cv=none; b=vNJFREaDsBFT5+bx6pCkZO0z68HTy0Lz8hiR5eVP1e0/FWd6LOT0kfL8apZcCk74J/kNdQFB7XDfl4d9O6nCKEEh27K0itBF8avFwkP1s+iB6fhuRiKH4q6KR8Gbs0gds2ZPB73qCBRcG5R117kBz8QYp69ySR87E6BgvTL9FSk= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1732828668; c=relaxed/simple; bh=PrmeAZAFcNanlCOYO3U1bgIaxvjjroqVtDuJIKH574w=; h=DKIM-Signature:Message-ID:Subject:From:To:Date:MIME-Version; b=um1+BhrIxNDCEQyqBLjA/wPcIENGto0QRA/HvxM0ji0K57a+Ub/qNktTWYveGHNiRN66wcMkYR6P2d9EqWIgEYV+SzTdzxE2EY4z2umH5w9psm95FHNuFqRrvk3h54Mw32iCnLXHq7+91LckjQAkgm7h+CAqLWpdvTLhQ+YyVqw= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E7B2F3858C3A Received: from vra-173-179.tugraz.at (vra-173-179.tugraz.at [129.27.173.179]) by mailrelay.tugraz.at (Postfix) with ESMTPSA id 4Xzpzy2Sp2z1LM0R; Thu, 28 Nov 2024 22:17:34 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.11.0 mailrelay.tugraz.at 4Xzpzy2Sp2z1LM0R DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tugraz.at; s=mailrelay; t=1732828654; bh=Ly0w7zv+QRqLeMxpjAJ1Qme+kP6tGhw49r53fKBMBDw=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=jAG/MHZFAJnxHlz6bECjhU4Lox5zN+/dZgUTcm05U2YSKUcnmCY6R2ZTuMU5APoP2 Jcmy1d49LdMh1+5IsPzkWXMV5x8KiuMYd4OfPJGyO4Hpl8SvXNjXYPKzu4OvFWPeS8 3IvDGvA+M8Zwc3KaYLiBSYaJkTkTBKximJHxvWyc= Message-ID: <6fca734702a1ba4225cb8fde9c5cbfad665b87a3.camel@tugraz.at> Subject: [PATCH] c: correct type compatibility for bit-fields [PR117828] From: Martin Uecker To: gcc-patches@gcc.gnu.org Cc: Joseph Myers Date: Thu, 28 Nov 2024 22:17:33 +0100 In-Reply-To: <49a04b095f6e80f286daee5b36d28bf076bee839.camel@tugraz.at> References: <93bdc0f1e3d8b08d52db6dd79b7565df35564cdb.camel@tugraz.at> <49a04b095f6e80f286daee5b36d28bf076bee839.camel@tugraz.at> User-Agent: Evolution 3.46.4-2 MIME-Version: 1.0 X-TUG-Backscatter-control: G/VXY7/6zeyuAY/PU2/0qw X-Spam-Scanner: SpamAssassin 3.003001 X-Spam-Score-relay: -1.9 X-Scanned-By: MIMEDefang 2.74 on 129.27.10.116 X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces~patchwork=sourceware.org@gcc.gnu.org Bit-fields need additional checks for type compatiblity. Bootstrapped and regression tested on x86_64. c: correct type compatibility for bit-fields [PR117828] Add missing test for consistency of bit-fields when comparing tagged types for compatibility. PR c/117828 gcc/c/ChangeLog: * c-typeck.c (tagged_types_tu_compatible_p): Add check. gcc/testsuite/ChangeLog: * c23-tag-bitfields-1.c: New test. * pr117828.c: New test. diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index 23ce0fc788d..dd13f212cd5 100644 --- a/gcc/c/c-typeck.cc +++ b/gcc/c/c-typeck.cc @@ -1909,18 +1909,33 @@ tagged_types_tu_compatible_p (const_tree t1, const_tree t2, gcc_assert (TREE_CODE (s1) == FIELD_DECL); gcc_assert (TREE_CODE (s2) == FIELD_DECL); + tree ft1 = TREE_TYPE (s1); + tree ft2 = TREE_TYPE (s2); + if (DECL_NAME (s1) != DECL_NAME (s2)) return false; if (DECL_ALIGN (s1) != DECL_ALIGN (s2)) return false; + if (DECL_C_BIT_FIELD (s1) != DECL_C_BIT_FIELD (s2)) + return false; + + if (DECL_C_BIT_FIELD (s1)) + { + if (!tree_int_cst_equal (DECL_SIZE (s1), DECL_SIZE (s2))) + return false; + + ft1 = DECL_BIT_FIELD_TYPE (s1); + ft2 = DECL_BIT_FIELD_TYPE (s2); + } + data->anon_field = !DECL_NAME (s1); data->pointedto = false; const struct tagged_tu_seen_cache *cache = data->cache; data->cache = &entry; - bool ret = comptypes_internal (TREE_TYPE (s1), TREE_TYPE (s2), data); + bool ret = comptypes_internal (ft1, ft2, data); data->cache = cache; if (!ret) return false; diff --git a/gcc/testsuite/gcc.dg/c23-tag-bitfields-1.c b/gcc/testsuite/gcc.dg/c23-tag-bitfields-1.c new file mode 100644 index 00000000000..d775d9f67a1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c23-tag-bitfields-1.c @@ -0,0 +1,51 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c23" } */ + +struct bar0 { int r : 16; }; +struct bar0 { int r : 16; }; + +struct bar1 { int r : 16; }; +struct bar1 { int r : 17; }; /* { dg-error "redefinition" } */ + +extern struct { int r : 14; } a; +extern struct { int r : 14; } b; + +extern struct { int r : 14; } x; +extern struct { int r : 13; } x; /* { dg-error "conflicting" } */ + +struct bar2 { int s; int: 0; }; +struct bar2 { int s; int: 15; }; /* { dg-error "redefinition" } */ + +struct bar3 { int s; int : 0; }; +struct bar3 { int s; }; /* { dg-error "redefinition" } */ + +struct bar4 { int r : 3; }; +struct bar4 { const int r : 3; }; /* { dg-error "redefinition" } */ + +struct bar5 { int r : 16; }; +struct bar5 { int r; }; /* { dg-error "redefinition" } */ + +union ubar { int r : 16; }; +union ubar { int r : 16; }; + +union ubar1 { int r : 16; }; +union ubar1 { int r : 17; }; /* { dg-error "redefinition" } */ + +extern union { int r : 14; } c; +extern union { int r : 14; } d; + +extern union { int r : 14; } y; +extern union { int r : 13; } y; /* { dg-error "conflicting" } */ + +union ubar2 { int s; int : 0; }; +union ubar2 { int s; int : 15; }; /* { dg-error "redefinition" } */ + +union ubar3 { int s: 3; int: 0; }; +union ubar3 { int s: 3; }; /* { dg-error "redefinition" } */ + +union ubar4 { int r : 3; }; +union ubar4 { const int r : 3; }; /* { dg-error "redefinition" } */ + +union ubar5 { int r : 16; }; +union ubar5 { int r; }; /* { dg-error "redefinition" } */ + diff --git a/gcc/testsuite/gcc.dg/pr117828.c b/gcc/testsuite/gcc.dg/pr117828.c new file mode 100644 index 00000000000..a219f8e51a2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr117828.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-g" } */ + +struct { + struct { + int Reserved : 32; + } u; +} v; +struct { + struct { + int Reserved; + } u; +} w; + +