From patchwork Thu Sep 29 11:43:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathan Sidwell X-Patchwork-Id: 1544 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f2ce:0:0:0:0:0 with SMTP id d14csp643447wrp; Thu, 29 Sep 2022 04:44:58 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6FUFmZjmIjNJZVfOx+SLPkpPjgFAQih6XuF59pm8Xelwknj3QvSiFklFV+3B3mKCvRRtID X-Received: by 2002:a17:906:db02:b0:780:24e:cf9 with SMTP id xj2-20020a170906db0200b00780024e0cf9mr2417482ejb.460.1664451897926; Thu, 29 Sep 2022 04:44:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1664451897; cv=none; d=google.com; s=arc-20160816; b=Uohq21tG/MDcTmzTAg8DncK0zTUKs3A2bZZVvebk7yEj+azGJ2wwHrA3CT8v6zKKjm uCFLVvg1QN3xRCl8gEM3iTcyY7cFbj8p61WzGzew5YnAskITaLefkw0YlQisUs5Mbib0 bTYXpetX3Qf66yuAn+BTPIAiICV1r7v0RowdS4k+Ia/tmNeVsXhjYveGJEmZGJpTovTm Zo72HXyUNPlVkSqfvoY1qrUDwFpYzSpLFTYq0aE+qDjpclixJMXa3r/ZkwkV1FQH6/ds EP5Rjp7RTOZ+uYUhAr5lZi/CxxddW5EqmQ1elA2mCEzO8FHvdC0vjjGWr/KPU94V/oU7 IJMg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:reply-to:from:list-subscribe:list-help :list-post:list-archive:list-unsubscribe:list-id:precedence:subject :to:content-language:user-agent:mime-version:date:message-id :dmarc-filter:delivered-to:dkim-signature:dkim-filter; bh=3q246OnYSdbRtL7Xslo9rsnxh6vfPyLYrCyWKGJE4Os=; b=C6S7eqYuQu23BSd4w2G5Gv5COE0BNhh7AkI5CL89jECLoz5KjhtoFH9uPe2vQnlrMc gnLBSm+cXnx+7o8+ZIpfjZfHCfd5fQIo+/jRQ+V5rS69OoP+2ziKiVdXKgjPCK257o8J gpc7WoXFDgpeFy20WENOHwH60NMcGSbuOMpo7KKkVkbsgvw2vljT3T/pVaS0lfzhfWnQ naX/LWeBem8ZqnhX1uKqQgVrkTDbjCzHiNkOCTQzjAUQ9R2d2uBIn1Lr30GOBw8XxpWD VE2gU6JsTyIUBLFXiMJWiVKT7PZbZd9QBEaD7xT3SegjC2VsgJzfqEI15ImuiIZS9co/ /lmg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=r+m4NitG; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id hr20-20020a1709073f9400b00782a001e367si6801565ejc.680.2022.09.29.04.44.57 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Sep 2022 04:44:57 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=r+m4NitG; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 789E8385734F for ; Thu, 29 Sep 2022 11:44:26 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 789E8385734F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1664451866; bh=3q246OnYSdbRtL7Xslo9rsnxh6vfPyLYrCyWKGJE4Os=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=r+m4NitGuISN7lpVhCsy+QvB+AMDFOqmRikEJT0cJNG/kIUrxCmUH3+OKc+io3+nY waMXq9SECDshNKjugUExacHSpsSSAb74Tn4ciBU5g+O8gEerwyLaabqVh34dngRlt6 UEpGgwwnUcG5ashtwQiByhHzYyDQD+20EMmJsPww= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-qt1-x82f.google.com (mail-qt1-x82f.google.com [IPv6:2607:f8b0:4864:20::82f]) by sourceware.org (Postfix) with ESMTPS id 755453858D3C for ; Thu, 29 Sep 2022 11:43:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 755453858D3C Received: by mail-qt1-x82f.google.com with SMTP id gb14so571647qtb.3 for ; Thu, 29 Sep 2022 04:43:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=subject:from:cc:to:content-language:user-agent:mime-version:date :message-id:sender:x-gm-message-state:from:to:cc:subject:date; bh=3q246OnYSdbRtL7Xslo9rsnxh6vfPyLYrCyWKGJE4Os=; b=MgW+fYi8T0Fisbnh2mC406AwRqSrsvWWPZP3kAKy5wQBe64UsfyR1cpQrPPGJYEIao ht6+gtXsR0YxIz5Osx11UmUIjnENuQVxGHn98KpHwyn7jtNkRrHCZoVXiurcpiY/3JLo HGcHyJF2yV6KOxvHA8PAKA+pOts0lcTAOdkzMOFPtkjda6y7qaB0a8Jtbjxw+aVATRDy LGdz2a5BOq9hM+EKjsvFk6qNvCVDlZlnPhATYTBFTFNDGA24HiPS+fkH0kWBdpFPA0RA bIvpQHMxCfQNaxS7BhCJN64oZIsghak8S1E9fM7zk/TzKnYqN6IHkRKpEg1xqY7XXVwj gAOQ== X-Gm-Message-State: ACrzQf3Nm0LpGvTTp0vqpE1vLGNtBPCbEkvdvCsJAdDVjHqPKyzCYv3M PPAMAEboO1QvrYrZeIl7Sec= X-Received: by 2002:a05:622a:591:b0:35d:472e:7338 with SMTP id c17-20020a05622a059100b0035d472e7338mr1949677qtb.164.1664451820781; Thu, 29 Sep 2022 04:43:40 -0700 (PDT) Received: from ?IPV6:2620:10d:c0a3:1407:d655:7607:59b:b7ab? ([2620:10d:c091:500::4:6688]) by smtp.googlemail.com with ESMTPSA id t6-20020a37ea06000000b006cbbc3daaacsm5709196qkj.113.2022.09.29.04.43.39 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 29 Sep 2022 04:43:40 -0700 (PDT) Message-ID: <31defc3d-cc4f-f42f-8f7e-a2272998513e@acm.org> Date: Thu, 29 Sep 2022 07:43:38 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.3.0 Content-Language: en-US To: Patrick Palka Subject: c++: import/export NTTP objects X-Spam-Status: No, score=-3038.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, 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.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Nathan Sidwell via Gcc-patches From: Nathan Sidwell Reply-To: Nathan Sidwell Cc: GCC Patches Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1745304313301604950?= X-GMAIL-MSGID: =?utf-8?q?1745304313301604950?= This adds smarts to the module machinery to handle NTTP object VAR_DECLs. Like typeinfo objects, these must be ignored in the symbol table, streamed specially and recreated on stream in. Patrick, thanks for the testcase, I don't know how to attribute that to you in the changelog anymore. nathan From a1f7f9541c2b20eb44750b9c15cd831c62d67f21 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Wed, 28 Sep 2022 09:21:14 -0700 Subject: [PATCH] c++: import/export NTTP objects This adds smarts to the module machinery to handle NTTP object VAR_DECLs. Like typeinfo objects, these must be ignored in the symbol table, streamed specially and recreated on stream in. gcc/cp/ PR c++/100616 * module.cc (enum tree_tag): Add tt_nttp_var. (trees_out::decl_node): Handle NTTP objects. (trees_in::tree_node): Handle tt_nttp_var. (depset::hash::add_binding_entry): Skip NTTP objects. gcc/testsuite/ PR c++/100616 * g++.dg/modules/100616_a.H: New. * g++.dg/modules/100616_b.C: New. * g++.dg/modules/100616_c.C: New. * g++.dg/modules/100616_d.C: New. --- gcc/cp/module.cc | 35 +++++++++++++++++++++++++ gcc/testsuite/g++.dg/modules/100616_a.H | 5 ++++ gcc/testsuite/g++.dg/modules/100616_b.C | 7 +++++ gcc/testsuite/g++.dg/modules/100616_c.C | 7 +++++ gcc/testsuite/g++.dg/modules/100616_d.C | 10 +++++++ 5 files changed, 64 insertions(+) create mode 100644 gcc/testsuite/g++.dg/modules/100616_a.H create mode 100644 gcc/testsuite/g++.dg/modules/100616_b.C create mode 100644 gcc/testsuite/g++.dg/modules/100616_c.C create mode 100644 gcc/testsuite/g++.dg/modules/100616_d.C diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index d965017940a..cbf3a77de01 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -2737,6 +2737,7 @@ enum tree_tag { tt_tinfo_var, /* Typeinfo object. */ tt_tinfo_typedef, /* Typeinfo typedef. */ tt_ptrmem_type, /* Pointer to member type. */ + tt_nttp_var, /* NTTP_OBJECT VAR_DECL. */ tt_parm, /* Function parameter or result. */ tt_enum_value, /* An enum value. */ @@ -8548,6 +8549,21 @@ trees_out::decl_node (tree decl, walk_kind ref) } return false; } + + if (DECL_NTTP_OBJECT_P (decl)) + { + /* A NTTP parm object. */ + if (streaming_p ()) + i (tt_nttp_var); + tree_node (tparm_object_argument (decl)); + tree_node (DECL_NAME (decl)); + int tag = insert (decl); + if (streaming_p ()) + dump (dumper::TREE) + && dump ("Wrote nttp object:%d %N", tag, DECL_NAME (decl)); + return false; + } + break; case TYPE_DECL: @@ -9627,6 +9643,21 @@ trees_in::tree_node (bool is_use) } break; + case tt_nttp_var: + /* An NTTP object. */ + { + tree init = tree_node (); + tree name = tree_node (); + if (!get_overrun ()) + { + res = get_template_parm_object (init, name); + int tag = insert (res); + dump (dumper::TREE) + && dump ("Created nttp object:%d %N", tag, name); + } + } + break; + case tt_enum_value: /* An enum const value. */ { @@ -12760,6 +12791,10 @@ depset::hash::add_binding_entity (tree decl, WMB_Flags flags, void *data_) /* Ignore TINFO things. */ return false; + if (TREE_CODE (decl) == VAR_DECL && DECL_NTTP_OBJECT_P (decl)) + /* Ignore NTTP objects. */ + return false; + if (!(flags & WMB_Using) && CP_DECL_CONTEXT (decl) != data->ns) { /* A using that lost its wrapper or an unscoped enum diff --git a/gcc/testsuite/g++.dg/modules/100616_a.H b/gcc/testsuite/g++.dg/modules/100616_a.H new file mode 100644 index 00000000000..9bc42bcc05b --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/100616_a.H @@ -0,0 +1,5 @@ +// { dg-additional-options {-std=c++20 -fmodule-header} } +// { dg-module-cmi {} } + +template struct C { }; +struct A { }; diff --git a/gcc/testsuite/g++.dg/modules/100616_b.C b/gcc/testsuite/g++.dg/modules/100616_b.C new file mode 100644 index 00000000000..416fd524b2c --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/100616_b.C @@ -0,0 +1,7 @@ +// { dg-additional-options {-std=c++20 -fmodules-ts} } + +export module pr100616_b; +// { dg-module-cmi pr100616_b } + +import "100616_a.H"; +export C c1; diff --git a/gcc/testsuite/g++.dg/modules/100616_c.C b/gcc/testsuite/g++.dg/modules/100616_c.C new file mode 100644 index 00000000000..5c79f5eef68 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/100616_c.C @@ -0,0 +1,7 @@ +// { dg-additional-options {-std=c++20 -fmodules-ts} } + +export module pr100616_c; +// { dg-module-cmi pr100616_c } + +import "100616_a.H"; +export C c2; diff --git a/gcc/testsuite/g++.dg/modules/100616_d.C b/gcc/testsuite/g++.dg/modules/100616_d.C new file mode 100644 index 00000000000..d9515db1140 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/100616_d.C @@ -0,0 +1,10 @@ +// { dg-additional-options {-std=c++20 -fmodules-ts} } + +import "100616_a.H"; +import pr100616_b; +import pr100616_c; + +C c0; +using type = decltype(c0); +using type = decltype(c1); +using type = decltype(c2); // bogus error: types of c1 and c2 don't match -- 2.30.2