From patchwork Wed Sep 11 12:51:49 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathaniel Shead X-Patchwork-Id: 1983947 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=DLcU+CcI; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; 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 [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 ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4X3gTF22Zcz1y1S for ; Wed, 11 Sep 2024 22:52:30 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B79EC3858C98 for ; Wed, 11 Sep 2024 12:52:28 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-pl1-x634.google.com (mail-pl1-x634.google.com [IPv6:2607:f8b0:4864:20::634]) by sourceware.org (Postfix) with ESMTPS id 6E7923858CDA for ; Wed, 11 Sep 2024 12:51:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6E7923858CDA 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 6E7923858CDA Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::634 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1726059120; cv=none; b=g1GEM/2dqfS0riSSIyoGH0wRtO/QCTq9mMSfNrxfrf27K1dV7DYT0U/bcm8ANNXbpkrOpKuEY7lOfa00QbxgzS+9geWH9tS3bUNs0UXJvteBs1gsp5JzHACK2Y80ZEgUY1NJBnkgrNv0lyrV/ypzYNbV42CVKY1BsifzkPknpGI= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1726059120; c=relaxed/simple; bh=8Xw8ayM5lPysTytKY/2Qe9PIRsLZg1JVCj69WZrRY30=; h=DKIM-Signature:Message-ID:Date:From:To:Subject:MIME-Version; b=JyJOi7LsuXHI82PzhJZCPUorKb3RqpYuRyCWsEwjMNZASNaM1eWcq9U+CgvjA5plktxmxwsWQyPnlmFONZAhXIVky/g9XdPO0CemQbouIQ2sMshtkQnD8I24l44wjgfRhOJ/yJAbALikPzpbaKfr0Hl0mJCQ9ua78eIsvqP/35E= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-pl1-x634.google.com with SMTP id d9443c01a7336-2058ba82fbfso2323615ad.0 for ; Wed, 11 Sep 2024 05:51:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1726059115; x=1726663915; 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=KCk7dFZM/ihG0QhUhEep+Rr6DuzfHDvZrNwimKJau0Y=; b=DLcU+CcIk6dfvZhb5vKBUSkMcUu62PePWrFX9kY5X61J3OIWccMEfdLGiIkT7Ox//R btdqy13pPIanolXPPamb7sohde71VR4Y9qg8qFA8B2au9nAyG1LxdYHxWqRVjd8TUEMo Yp9fhSAGBdvgmcMQ4PBnbKgzbBQPCTFPL2jz8H1WGDPWxvl0LRhpaUedsaeT7uZFqPyc GlFb/GkPIliGHJ0By4dpjtlThMwe3scyzXrUzkOSj3RYZojXIjIKcRwCyObwT7Bwvt9C LTX4Qmaymq9Fw7W5Ya0TmKAvbvTWWb6u9JK0Scztpjg3uSryOCjU2QItsAOnE8NeNIzu z2TQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1726059115; x=1726663915; 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=KCk7dFZM/ihG0QhUhEep+Rr6DuzfHDvZrNwimKJau0Y=; b=xKVhEVyCvmt4MEvJmyybkXESl/XLuz789zB67t4FxlUjJ0jYtKUE6fIvJHkDG/68O0 Qp8ntRiEKHQlQ/d45hy5rmrtdMBRsnEYMbbnqmiaMYeKAWOvZeeik7FzzPWCC6AqZHnT Y5GwoLoqLAcq3a7KXpEP21iP1vP+ODAM8HACsOJrDYfjO5YbmQ7LfkYyX3VsH/fU5wRp Cj6yqOhvMaELXBvw/qZwL7Y0/h//YQQJFPNIUa1h2gPpNW7Erl4f0wPfocecvJBPK4G4 LLxkN8nyqkjRP3r+K9FspWb+hfBR0oJgHTGUZbc+0wr7l/dLFZaBmrdlVTIAetGvecxR u+ew== X-Gm-Message-State: AOJu0YyTC11sx6PFIbB4cvmuOe+dhgxIqVTjEpcU1GpWDr85mrsXoCfk ROfiKmJo6lmH0vd7xkKfwzHyqCKcyriO47jm41ubdcYgtgnlMoP7E659iQ== X-Google-Smtp-Source: AGHT+IEwDyunJkshFCRBrjsFABi3rddxD17r5l+jj8dhOeAZSzGxt7Xrr2jVunMC9vHXxiFPIn3Y7w== X-Received: by 2002:a17:903:41c3:b0:205:4415:c62f with SMTP id d9443c01a7336-2074c4b7069mr24999865ad.1.1726059115033; Wed, 11 Sep 2024 05:51:55 -0700 (PDT) Received: from Thaum. (163-47-68-2.ipv4.originbroadband.com.au. [163.47.68.2]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-20710e353ecsm63088295ad.116.2024.09.11.05.51.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Sep 2024 05:51:54 -0700 (PDT) Message-ID: <66e1926a.170a0220.131db8.43a0@mx.google.com> X-Google-Original-Message-ID: Date: Wed, 11 Sep 2024 22:51:49 +1000 From: Nathaniel Shead To: gcc-patches@gcc.gnu.org Cc: Jason Merrill , Nathan Sidwell Subject: [PATCH] c++/modules: Really always track partial specialisations [PR116496] MIME-Version: 1.0 Content-Disposition: inline X-Spam-Status: No, score=-11.8 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 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 -- My last fix for this issue (PR c++/114947, r15-810) didn't go far enough; I had assumed that the issue where we lost track of partial specialisations we would need to walk again later was limited to partitions (where we always re-walk all specialisations), but the linked PR is the same cause but for header units, and it is possible to construct test cases exposing the same bug just for normal modules. As such this patch just unconditionally ensures that whenever we modify DECL_TEMPLATE_SPECIALIZATIONS we also track any partial specialisations that might have added. Also clean up a couple of comments and assertions to make expected state more obvious when processing these specs. PR c++/116496 gcc/cp/ChangeLog: * module.cc (trees_in::decl_value): Don't call set_defining_module_for_partial_spec here. (depset::hash::add_partial_entities): Clarity assertions. * pt.cc (add_mergeable_specialization): Always call set_defining_module_for_partial_spec when adding a partial spec. gcc/testsuite/ChangeLog: * g++.dg/modules/partial-5_a.C: New test. * g++.dg/modules/partial-5_b.C: New test. Signed-off-by: Nathaniel Shead --- gcc/cp/module.cc | 25 +++++++++++----------- gcc/cp/pt.cc | 1 + gcc/testsuite/g++.dg/modules/partial-5_a.C | 9 ++++++++ gcc/testsuite/g++.dg/modules/partial-5_b.C | 9 ++++++++ 4 files changed, 31 insertions(+), 13 deletions(-) create mode 100644 gcc/testsuite/g++.dg/modules/partial-5_a.C create mode 100644 gcc/testsuite/g++.dg/modules/partial-5_b.C diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index 647208944da..eedcd0ec076 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -8434,11 +8434,6 @@ 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) @@ -13356,16 +13351,20 @@ depset::hash::add_partial_entities (vec *partial_classes) specialization. */ gcc_checking_assert (dep->get_entity_kind () == depset::EK_PARTIAL); + + /* Only emit GM entities if reached. */ + if (!DECL_LANG_SPECIFIC (inner) + || !DECL_MODULE_PURVIEW_P (inner)) + dep->set_flag_bit (); } else - /* It was an explicit specialization, not a partial one. */ - gcc_checking_assert (dep->get_entity_kind () - == depset::EK_SPECIALIZATION); - - /* Only emit GM entities if reached. */ - if (!DECL_LANG_SPECIFIC (inner) - || !DECL_MODULE_PURVIEW_P (inner)) - dep->set_flag_bit (); + { + /* It was an explicit specialization, not a partial one. + We should have already added this. */ + gcc_checking_assert (dep->get_entity_kind () + == depset::EK_SPECIALIZATION); + gcc_checking_assert (dep->is_special ()); + } } } diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 9195a5274e1..b8dd7e3a0ee 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -31685,6 +31685,7 @@ add_mergeable_specialization (bool decl_p, spec_entry *elt, tree decl, DECL_TEMPLATE_SPECIALIZATIONS (elt->tmpl)); TREE_TYPE (cons) = decl_p ? TREE_TYPE (elt->spec) : elt->spec; DECL_TEMPLATE_SPECIALIZATIONS (elt->tmpl) = cons; + set_defining_module_for_partial_spec (STRIP_TEMPLATE (decl)); } } diff --git a/gcc/testsuite/g++.dg/modules/partial-5_a.C b/gcc/testsuite/g++.dg/modules/partial-5_a.C new file mode 100644 index 00000000000..768e6995f0f --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/partial-5_a.C @@ -0,0 +1,9 @@ +// PR c++/116496 +// { dg-additional-options "-fmodules-ts -std=c++20 -Wno-global-module" } +// { dg-module-cmi A } + +module; +template struct S {}; +export module A; +template struct S {}; +template requires false struct S {}; diff --git a/gcc/testsuite/g++.dg/modules/partial-5_b.C b/gcc/testsuite/g++.dg/modules/partial-5_b.C new file mode 100644 index 00000000000..95401fe8b56 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/partial-5_b.C @@ -0,0 +1,9 @@ +// PR c++/116496 +// { dg-additional-options "-fmodules-ts -std=c++20 -Wno-global-module" } +// { dg-module-cmi B } + +module; +template struct S {}; +export module B; +import A; +template requires true struct S {};