From patchwork Fri Dec 8 16:43:50 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Uecker X-Patchwork-Id: 1873882 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=tugraz.at header.i=@tugraz.at header.a=rsa-sha256 header.s=mailrelay header.b=UOC1DRGZ; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4Smxmp5Cs0z23nW for ; Sat, 9 Dec 2023 03:44:10 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 459D93858C3A for ; Fri, 8 Dec 2023 16:44:08 +0000 (GMT) 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 4F6093858C53 for ; Fri, 8 Dec 2023 16:43:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4F6093858C53 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 4F6093858C53 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=1702053837; cv=none; b=Ke9PGsrDa/WbWPyFLg1Hcr/GxtuVmMHleI/MtEC4DYe4siJAo5/uEfssF46YkmLkFSKVluh+XXbS7f4SivxrIgg13MZYNdSSxgZsX6twWoFxqtYAespejy+Dc1almSH0AbwUJgjkQyese0WzaF8ByKo5sx23TtoUod2G20ltqYs= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702053837; c=relaxed/simple; bh=KEotDEeswTOmVFlYPMk8THt2kbNNPNvFBGNPZhYVt4o=; h=DKIM-Signature:Message-ID:Subject:From:To:Date:MIME-Version; b=XXXEDzsu650jNTey8y1pox37sq2HBU5HLF0YJKIswAI8d8UnzpGPsN+A7cFZb/n4FMidZcGrmcMcb/NvtXWQ0Oij2wzIxXx9wxO3W7sIl9jzn1c8kOH//lkN6K7n0DoMcBJ5njY8u0OTUzh4ffR3hDwca+hIw41CzMJwaSFcof0= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from vra-170-126.tugraz.at (vra-170-126.tugraz.at [129.27.170.126]) by mailrelay.tugraz.at (Postfix) with ESMTPSA id 4SmxmQ4cJQz1LLyr; Fri, 8 Dec 2023 17:43:50 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.11.0 mailrelay.tugraz.at 4SmxmQ4cJQz1LLyr DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tugraz.at; s=mailrelay; t=1702053831; bh=4UgVOvp/l/oFYYqlEOWl8j8ae6rE3vgQTKXl7fifs64=; h=Subject:From:To:Cc:Date:From; b=UOC1DRGZ8Se96n2l2KE/NvMp0k5d89vsI1wi+sezW5qQpKqR6rzVLbAPN8pdTplHv Tq5gfbj4pOTN5ITRP/aJHnR4hpVJh9gtAX8QJOopxN7NigcakCmOy9NUF/qIrmkdFq 40+AEKqV66Vp8FQI+5aOHcGJgJa8E7mW6x+ptURY= Message-ID: <6194d2a421117c3830d2afbe2bf3bb53b4f9565e.camel@tugraz.at> Subject: [C PATCH] Fix regression causing ICE for structs with VLAs [PR 112488] From: Martin Uecker To: gcc-patches@gcc.gnu.org Cc: Joseph Myers , Richard Biener Date: Fri, 08 Dec 2023 17:43:50 +0100 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.6 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, T_SCC_BODY_TEXT_LINE 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+incoming=patchwork.ozlabs.org@gcc.gnu.org This fixes a regression caused by my previous VM fixes. Fix regression causing ICE for structs with VLAs [PR 112488] A previous patch the fixed several ICEs related to size expressions of VM types (PR c/70418, ...) caused a regression for structs where a DECL_EXPR is not generated anymore although reqired. We now call add_decl_expr introduced by the previous patch from finish_struct. The function gets a new argument to not set the TYPE_NAME for the type to the DECL_EXPR in this spicitic case. PR c/112488 gcc/c * c-decl.cc (add_decl_expr): Add argument. (finish_struct): Create DECL_EXPR. (c_simulate_record_decl): Adapt. * c-parser.cc (c_parser_struct_or_union_specifier): Call finish_struct with expression for VLA sizes. * c-tree.h (finish_struct): Add argument. gcc/testsuite * gcc.dg/pr112488-1.c: New test. * gcc.dg/pr112488-2.c: New test. * gcc.dg/pr112898.c: New test. * gcc.misc-tests/gcov-pr85350.c: Adapt. --- gcc/c/c-decl.cc | 22 +++++++++++++++------ gcc/c/c-parser.cc | 2 +- gcc/c/c-tree.h | 3 ++- gcc/testsuite/gcc.dg/pr112488-1.c | 14 +++++++++++++ gcc/testsuite/gcc.dg/pr112488-2.c | 13 ++++++++++++ gcc/testsuite/gcc.dg/pr112898.c | 9 +++++++++ gcc/testsuite/gcc.misc-tests/gcov-pr85350.c | 2 +- 7 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr112488-1.c create mode 100644 gcc/testsuite/gcc.dg/pr112488-2.c create mode 100644 gcc/testsuite/gcc.dg/pr112898.c diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc index 92c83e1bf10..0b500c19e70 100644 --- a/gcc/c/c-decl.cc +++ b/gcc/c/c-decl.cc @@ -6619,7 +6619,7 @@ smallest_type_quals_location (const location_t *locations, use BIND_EXPRs in TYPENAME contexts too. */ static void add_decl_expr (location_t loc, enum decl_context decl_context, tree type, - tree *expr) + tree *expr, bool set_name_p) { tree bind = NULL_TREE; if (decl_context == TYPENAME || decl_context == PARM @@ -6636,7 +6636,8 @@ add_decl_expr (location_t loc, enum decl_context decl_context, tree type, pushdecl (decl); DECL_ARTIFICIAL (decl) = 1; add_stmt (build_stmt (DECL_SOURCE_LOCATION (decl), DECL_EXPR, decl)); - TYPE_NAME (type) = decl; + if (set_name_p) + TYPE_NAME (type) = decl; if (bind) { @@ -7635,7 +7636,7 @@ grokdeclarator (const struct c_declarator *declarator, type has a name/declaration of it's own, but special attention is required if the type is anonymous. */ if (!TYPE_NAME (type) && c_type_variably_modified_p (type)) - add_decl_expr (loc, decl_context, type, expr); + add_decl_expr (loc, decl_context, type, expr, true); type = c_build_pointer_type (type); @@ -7900,7 +7901,7 @@ grokdeclarator (const struct c_declarator *declarator, /* The pointed-to type may need a decl expr (see above). */ if (!TYPE_NAME (type) && c_type_variably_modified_p (type)) - add_decl_expr (loc, decl_context, type, expr); + add_decl_expr (loc, decl_context, type, expr, true); type = c_build_pointer_type (type); type_quals = array_ptr_quals; @@ -9257,7 +9258,8 @@ is_flexible_array_member_p (bool is_last_field, tree finish_struct (location_t loc, tree t, tree fieldlist, tree attributes, - class c_struct_parse_info *enclosing_struct_parse_info) + class c_struct_parse_info *enclosing_struct_parse_info, + tree *expr) { tree x; bool toplevel = file_scope == current_scope; @@ -9595,6 +9597,13 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes, finish_incomplete_vars (incomplete_vars, toplevel); + /* Make sure a DECL_EXPR is created for structs with VLA members. + Because we do not know the context, we use decl_context TYPENAME + here to force creation of a BIND_EXPR which is required in some + contexts. */ + if (c_type_variably_modified_p (t)) + add_decl_expr (loc, TYPENAME, t, expr, false); + if (warn_cxx_compat) warn_cxx_compat_finish_struct (fieldlist, TREE_CODE (t), loc); @@ -10191,7 +10200,8 @@ c_simulate_record_decl (location_t loc, const char *name, DECL_CHAIN (fields[i - 1]) = fields[i]; } - finish_struct (loc, type, fields[0], NULL_TREE, struct_info); + tree expr = NULL_TREE; + finish_struct (loc, type, fields[0], NULL_TREE, struct_info, &expr); tree decl = build_decl (loc, TYPE_DECL, ident, type); set_underlying_type (decl); diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index df9a07928b5..dcb6c21da41 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -4087,7 +4087,7 @@ c_parser_struct_or_union_specifier (c_parser *parser) ret.spec = finish_struct (struct_loc, type, nreverse (contents), chainon (std_attrs, chainon (attrs, postfix_attrs)), - struct_info); + struct_info, &expr); ret.kind = ctsk_tagdef; ret.expr = expr; ret.expr_const_operands = true; diff --git a/gcc/c/c-tree.h b/gcc/c/c-tree.h index d0bdc3df2c2..da8ee8b40f0 100644 --- a/gcc/c/c-tree.h +++ b/gcc/c/c-tree.h @@ -656,7 +656,8 @@ extern void finish_decl (tree, location_t, tree, tree, tree); extern tree finish_enum (tree, tree, tree); extern void finish_function (location_t = input_location); extern tree finish_struct (location_t, tree, tree, tree, - class c_struct_parse_info *); + class c_struct_parse_info *, + tree *expr); extern tree c_simulate_enum_decl (location_t, const char *, vec *); extern tree c_simulate_record_decl (location_t, const char *, diff --git a/gcc/testsuite/gcc.dg/pr112488-1.c b/gcc/testsuite/gcc.dg/pr112488-1.c new file mode 100644 index 00000000000..b53295c4366 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr112488-1.c @@ -0,0 +1,14 @@ +/* { dg-do compile } + * { dg-options "-O1" } */ + +extern void abort(void); + +int test(int *n) { + struct T { char a[*n], b[*n]; }; + return sizeof(struct T) - sizeof(struct T); +} + +void f1(int *p) { + if (!test(p)) abort(); +} + diff --git a/gcc/testsuite/gcc.dg/pr112488-2.c b/gcc/testsuite/gcc.dg/pr112488-2.c new file mode 100644 index 00000000000..b5e5fbd3f2b --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr112488-2.c @@ -0,0 +1,13 @@ +/* { dg-do compile } + * { dg-options "-std=gnu23 -O1" } */ + +extern void abort(void); + +int test(int *n, struct T { char a[*n], b[*n]; }*) { + return sizeof(struct T) - sizeof(struct T); +} + +void f1(int *p) { + if (test(p, 0)) abort(); +} + diff --git a/gcc/testsuite/gcc.dg/pr112898.c b/gcc/testsuite/gcc.dg/pr112898.c new file mode 100644 index 00000000000..395f3afaf2e --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr112898.c @@ -0,0 +1,9 @@ +/* { dg-do compile } + { dg-options "-O2 -finstrument-functions-once" } */ + +void func(int n) +{ + struct T { int x[n]; }; + struct T *t = __builtin_malloc(sizeof *t); +} + diff --git a/gcc/testsuite/gcc.misc-tests/gcov-pr85350.c b/gcc/testsuite/gcc.misc-tests/gcov-pr85350.c index a42bf1282b2..0383b81fdfb 100644 --- a/gcc/testsuite/gcc.misc-tests/gcov-pr85350.c +++ b/gcc/testsuite/gcc.misc-tests/gcov-pr85350.c @@ -4,7 +4,7 @@ int main (void) { const int t = 2; /* count(1) */ - struct s1 { /* count(-) */ + struct s1 { /* count(1) */ int x; int g[t]; };