From patchwork Sun May 12 13:29:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathaniel Shead X-Patchwork-Id: 1934275 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=lJxg9zQq; 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 4Vck4z6xwCz20KK for ; Sun, 12 May 2024 23:30:09 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CFB37384AB60 for ; Sun, 12 May 2024 13:30:07 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-pl1-x632.google.com (mail-pl1-x632.google.com [IPv6:2607:f8b0:4864:20::632]) by sourceware.org (Postfix) with ESMTPS id 35A793858C53 for ; Sun, 12 May 2024 13:29:47 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 35A793858C53 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 35A793858C53 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::632 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715520589; cv=none; b=tw+uE/9O6HE6GCaUXwsZr98ovYMKdTc80p3DTcc3HpUFv4dera+ZyXSocVNipFrqVgXweyDmgXBP+xrRMIGF4gvgs8hsNTLrbCiSRG7gPbPHKgz5MnlSqIXBTiTURCxWELWTrFj/LbKkcmSGNdAXimdW+te7zbJibFzFM1k7zlo= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715520589; c=relaxed/simple; bh=jBmyiAW52PVV2zNfzRXSDNeKPQBqD2074YD8AwSyPs0=; h=DKIM-Signature:Message-ID:Date:From:To:Subject:MIME-Version; b=KHeRP+Z6avdkRG4f/bj+mKQQWF9iZDsTxD9pkH2/8FXywfFSesxGq+9xlcd2VJZzbgkUFxpYZppYUNnSup2Pnp8RceJddrKOJ+lIq4YPpGS1wJJbBQrJlwSAmRl4vAeTXizCJQA1oUoq1zovXzuMzos5A3GHLxSlxrVkTEXt4kI= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-pl1-x632.google.com with SMTP id d9443c01a7336-1ecd9a81966so31616285ad.0 for ; Sun, 12 May 2024 06:29:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1715520586; x=1716125386; darn=gcc.gnu.org; h=content-disposition:mime-version:subject:cc:to:from:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=HlNg4P15Ig7nRrnot15u/ojBEfHc5+iloifgbAglSxg=; b=lJxg9zQqIMhqpWSlu+g/Xc4UIZUQe0OFYelVi+X/5Z1AwaiTp/PYoBeutHcbj+Uu/l mCFX1aaVlAA/wvqetmauaceZWPvwyZZKqf5wuFE9G62V2+6RehiszHJ+MCJvaIVo22o5 wWPnY/09sbdOBAR+hTYvfSJo8uqnoCD/G57axZWR5qCdOa1UqaF7FnwV08keFPkYnDK8 lVPhL9+sfs7L2An2XqIyLjyrU+387u183pq5sRzKv4UhmDR5wxQujiA2vOJ+K9j8S4YP mvaN9MLWbSjtNLBcob2FqQh2uwD28fIJ+2CuFGn/LrNvczODWPnfq66YFVWc9tmDFCjy nIbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715520586; x=1716125386; h=content-disposition:mime-version:subject:cc:to:from:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=HlNg4P15Ig7nRrnot15u/ojBEfHc5+iloifgbAglSxg=; b=qdRtwwWrbz9dvCG8bEzQMx7WWHRdyxDpYg/U/YQac5oj9aUvkxQyAPn00Rd9iZYn0K l4L2wowdmibFsOSVKrSc75AE1TneWmXuJwYZmZvfb3OUabH9shS31baIoj85guPXbGro JQBzyllmkeDW7enfjgCPVgtbKlnyM0J1aE5uVzj/+ArVdCW5ySMh/+5uXbuC6ahcRX9p eXQKu+2DRKjlR5s5pMJrEbTJtubNQI/84y8qH+giz6wEXPc3LMhyuk3fM4X+fWHtO3eZ 07jlyXfeZMTgSVvHy7jYuQT2iyDHdyixxL7qEchxIjeOaA7X4Ma1cx0qa7nKOFFDAXBs rmXA== X-Gm-Message-State: AOJu0YwmP1B+1DMhptT7XWmL+zhFEVydAAQvJT9yl2kGRNAAiQk7bXlC qOHcxu3eTQr34pUR3M7vSbIcN8nycjZvcjTbUS4PzZ4lT6GBlQzgOzKmQQ== X-Google-Smtp-Source: AGHT+IFlqGPnOTlg+WqaDXs8Ica9l5P37WzPZr+p1rm7n1KH439suBE8p4GWMLD2k3OcJLCISaSLPQ== X-Received: by 2002:a17:902:f54c:b0:1e2:58b7:2dd6 with SMTP id d9443c01a7336-1eefa574153mr166328715ad.21.1715520585938; Sun, 12 May 2024 06:29:45 -0700 (PDT) Received: from Thaum. (14-200-72-253.tpgi.com.au. [14.200.72.253]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c2562f8sm61795795ad.285.2024.05.12.06.29.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 May 2024 06:29:45 -0700 (PDT) Message-ID: <6640c449.170a0220.9790b.fc84@mx.google.com> X-Google-Original-Message-ID: Date: Sun, 12 May 2024 23:29:39 +1000 From: Nathaniel Shead To: gcc-patches@gcc.gnu.org Cc: Jason Merrill , Nathan Sidwell Subject: [PATCH] c++/modules: Ensure all partial specialisations are tracked [PR114947] MIME-Version: 1.0 Content-Disposition: inline X-Spam-Status: No, score=-10.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, URIBL_BLACK 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 Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk? -- >8 -- Constrained partial specialisations aren't all necessarily tracked on the instantiation table. The modules code uses a separate 'partial_specializations' table to track them instead to ensure that they get walked and emitted when emitting a module, but currently this does not always happen. The attached testcase fails in two ways. First, because the partial specialisation is just a declaration (and not a definition), 'set_defining_module' never ends up getting called on it and so it never gets added to the partial specialisation table. We fix this by ensuring that when partial specializations are created they always get added, and so we never miss one. To prevent adding partial specialisations multiple times we split this out as a new function. The second way it fails is that when exporting the primary interface for a module with partitions, we also re-walk the specializations of all imported partitions to merge them into a single BMI. So this patch ensures that after calling 'match_mergeable_specialization' we also ensure that if the name came from a partition it gets added to the specialization table so that a dependency is correctly created for it. PR c++/114947 gcc/cp/ChangeLog: * cp-tree.h (set_defining_module_for_partial_spec): Declare. * module.cc (trees_in::decl_value): Track partial specs coming from partitions. (set_defining_module): Don't track partial specialisations here anymore. (set_defining_module_for_partial_spec): New function. * pt.cc (process_partial_specialization): Call it. gcc/testsuite/ChangeLog: * g++.dg/modules/partial-4_a.C: New test. * g++.dg/modules/partial-4_b.C: New test. Signed-off-by: Nathaniel Shead --- gcc/cp/cp-tree.h | 1 + gcc/cp/module.cc | 22 ++++++++++++++++++---- gcc/cp/pt.cc | 2 ++ gcc/testsuite/g++.dg/modules/partial-4_a.C | 8 ++++++++ gcc/testsuite/g++.dg/modules/partial-4_b.C | 5 +++++ 5 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/modules/partial-4_a.C create mode 100644 gcc/testsuite/g++.dg/modules/partial-4_b.C diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index db098c32f2d..2580bf05fb2 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -7418,6 +7418,7 @@ extern unsigned get_importing_module (tree, bool = false) ATTRIBUTE_PURE; /* Where current instance of the decl got declared/defined/instantiated. */ extern void set_instantiating_module (tree); extern void set_defining_module (tree); +extern void set_defining_module_for_partial_spec (tree); extern void maybe_key_decl (tree ctx, tree decl); extern void propagate_defining_module (tree decl, tree orig); extern void remove_defining_module (tree decl); diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index 520dd710549..3ca963cb3e9 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -8416,6 +8416,11 @@ trees_in::decl_value () add_mergeable_specialization (!is_type, &spec, decl, spec_flags); } + /* When making a CMI from a partition we're going to need to walk partial + specializations again, so make sure they're tracked. */ + if (state->is_partition () && (spec_flags & 2)) + set_defining_module_for_partial_spec (inner); + if (NAMESPACE_SCOPE_P (decl) && (mk == MK_named || mk == MK_unique || mk == MK_enum || mk == MK_friend_spec) @@ -19246,13 +19251,22 @@ set_defining_module (tree decl) vec_safe_push (class_members, decl); } } - else if (DECL_IMPLICIT_TYPEDEF_P (decl) - && CLASSTYPE_TEMPLATE_SPECIALIZATION (TREE_TYPE (decl))) - /* This is a partial or explicit specialization. */ - vec_safe_push (partial_specializations, decl); } } +/* Also remember DECL if it's a newly declared class template partial + specialization, because these are not necessarily added to the + instantiation tables. */ + +void +set_defining_module_for_partial_spec (tree decl) +{ + if (module_p () + && DECL_IMPLICIT_TYPEDEF_P (decl) + && CLASSTYPE_TEMPLATE_SPECIALIZATION (TREE_TYPE (decl))) + vec_safe_push (partial_specializations, decl); +} + void set_originating_module (tree decl, bool friend_p ATTRIBUTE_UNUSED) { diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 1816bfd1f40..6d33bac90b0 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -5456,6 +5456,8 @@ process_partial_specialization (tree decl) gcc_checking_assert (!TI_PARTIAL_INFO (tinfo)); TI_PARTIAL_INFO (tinfo) = build_template_info (tmpl, NULL_TREE); + set_defining_module_for_partial_spec (decl); + for (inst = DECL_TEMPLATE_INSTANTIATIONS (maintmpl); inst; inst = TREE_CHAIN (inst)) { diff --git a/gcc/testsuite/g++.dg/modules/partial-4_a.C b/gcc/testsuite/g++.dg/modules/partial-4_a.C new file mode 100644 index 00000000000..e74bb0ad866 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/partial-4_a.C @@ -0,0 +1,8 @@ +// PR c++/114947 +// { dg-additional-options "-fmodules-ts -std=c++20" } +// { dg-module-cmi M:part } +module M:part; + +template struct R {}; +template requires false struct R {}; +template requires true struct R; diff --git a/gcc/testsuite/g++.dg/modules/partial-4_b.C b/gcc/testsuite/g++.dg/modules/partial-4_b.C new file mode 100644 index 00000000000..1c645671a55 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/partial-4_b.C @@ -0,0 +1,5 @@ +// PR c++/114947 +// { dg-additional-options "-fmodules-ts -std=c++20" } +// { dg-module-cmi M } +export module M; +import :part;