[{"id":3682139,"web_url":"http://patchwork.ozlabs.org/comment/3682139/","msgid":"<d9da09b5-d0fa-4e90-be9f-baceb6b8dd91@redhat.com>","list_archive_url":null,"date":"2026-04-24T16:56:26","subject":"Re: [PATCH] c++/modules: defer completion of streamed-in cNTTPs\n [PR124953]","submitter":{"id":4337,"url":"http://patchwork.ozlabs.org/api/people/4337/","name":"Jason Merrill","email":"jason@redhat.com"},"content":"On 4/24/26 11:01 AM, Patrick Palka wrote:\n> Tested on x86_64-pc-linux-gnu, does this look OK for trunk/16.2?\n\nOK.\n\n> -- >8 --\n> \n> Here we hit lazy loading recursion when streaming in the cNTTP object\n> wrap<Storage>{}, via get_template_parm_object -> cp_finish_decl ->\n> ensure_literal_type_for_constexpr_object -> complete_type, apparently\n> the class definition of wrap<Storage> hasn't been streamed in yet.\n> If we disable that literal type check for NTTP objects, we still hit\n> recursion, from layout_var_decl.\n> \n> It seems prudent to defer calling cp_finish_decl for NTTP objects until\n> after lazy loading has completed like we do for expand_or_defer_fn and\n> cdtors.  This patch arranges that, as a follow-up to the previous fixes\n> r15-3031 and r16-318 for NTTP object streaming.\n> \n> \tPR c++/124953\n> \n> gcc/cp/ChangeLog:\n> \n> \t* module.cc (trees_in::tree_node) <tt_nttp_var>: Push the result\n> \tof get_template_parm_object to post_load_decls.\n> \t(post_load_processing): Call cp_finish_decl on any not yet\n> \tcompleted NTTP objects.\n> \t* pt.cc (get_template_parm_object): Don't call cp_finish_decl\n> \twhen !check_init.\n> \n> gcc/testsuite/ChangeLog:\n> \n> \t* g++.dg/modules/tpl-nttp-3_a.H: New test.\n> \t* g++.dg/modules/tpl-nttp-3_b.C: New test.\n> ---\n>   gcc/cp/module.cc                            | 12 ++++++++++++\n>   gcc/cp/pt.cc                                |  3 +++\n>   gcc/testsuite/g++.dg/modules/tpl-nttp-3_a.H | 11 +++++++++++\n>   gcc/testsuite/g++.dg/modules/tpl-nttp-3_b.C |  5 +++++\n>   4 files changed, 31 insertions(+)\n>   create mode 100644 gcc/testsuite/g++.dg/modules/tpl-nttp-3_a.H\n>   create mode 100644 gcc/testsuite/g++.dg/modules/tpl-nttp-3_b.C\n> \n> diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc\n> index 98a285201d00..4d6df0564d91 100644\n> --- a/gcc/cp/module.cc\n> +++ b/gcc/cp/module.cc\n> @@ -10872,6 +10872,7 @@ trees_in::tree_node (bool is_use)\n>   \t    int tag = insert (res);\n>   \t    dump (dumper::TREE)\n>   \t      && dump (\"Created nttp object:%d %N\", tag, name);\n> +\t    vec_safe_push (post_load_decls, res);\n>   \t  }\n>         }\n>         break;\n> @@ -20531,6 +20532,17 @@ post_load_processing ()\n>   \n>         dump () && dump (\"Post-load processing of %N\", decl);\n>   \n> +      if (VAR_P (decl) && DECL_NTTP_OBJECT_P (decl))\n> +\t{\n> +\t  if (!DECL_SIZE (decl))\n> +\t    {\n> +\t      push_to_top_level ();\n> +\t      cp_finish_decl (decl, DECL_INITIAL (decl), false, NULL_TREE, 0);\n> +\t      pop_from_top_level ();\n> +\t    }\n> +\t  continue;\n> +\t}\n> +\n>         gcc_checking_assert (DECL_MAYBE_IN_CHARGE_CDTOR_P (decl));\n>         expand_or_defer_fn (decl);\n>         /* As in module_state::read_cluster.  */\n> diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc\n> index fca63d3950dd..ce324c87ecf8 100644\n> --- a/gcc/cp/pt.cc\n> +++ b/gcc/cp/pt.cc\n> @@ -7582,6 +7582,9 @@ get_template_parm_object (tree expr, tree name, bool check_init/*=true*/)\n>         /* FIXME setting TREE_CONSTANT on refs breaks the back end.  */\n>         if (!TYPE_REF_P (type))\n>   \tTREE_CONSTANT (decl) = true;\n> +      pushdecl_top_level (decl);\n> +      /* The caller must call cp_finish_decl to complete its processing.  */\n> +      return decl;\n>       }\n>   \n>     pushdecl_top_level_and_finish (decl, expr);\n> diff --git a/gcc/testsuite/g++.dg/modules/tpl-nttp-3_a.H b/gcc/testsuite/g++.dg/modules/tpl-nttp-3_a.H\n> new file mode 100644\n> index 000000000000..1b28780b14b6\n> --- /dev/null\n> +++ b/gcc/testsuite/g++.dg/modules/tpl-nttp-3_a.H\n> @@ -0,0 +1,11 @@\n> +// PR c++/124953\n> +// { dg-do compile { target c++20 } }\n> +// { dg-additional-options \"-fmodule-header\" }\n> +\n> +template <class T> struct wrap { using type = T; };\n> +template <auto V> using unwrap = decltype(V)::type;\n> +\n> +struct Foo {\n> +  struct Storage {};\n> +  unwrap<wrap<Storage>{}> data_{};\n> +};\n> diff --git a/gcc/testsuite/g++.dg/modules/tpl-nttp-3_b.C b/gcc/testsuite/g++.dg/modules/tpl-nttp-3_b.C\n> new file mode 100644\n> index 000000000000..2a51186c64d3\n> --- /dev/null\n> +++ b/gcc/testsuite/g++.dg/modules/tpl-nttp-3_b.C\n> @@ -0,0 +1,5 @@\n> +// PR c++/124953\n> +// { dg-do compile { target c++20 } }\n> +// { dg-additional-options \"-fmodules -fno-module-lazy\" }\n> +\n> +import \"tpl-nttp-3_a.H\";","headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=aVcbgl3O;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=38.145.34.32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (1024-bit key,\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=aVcbgl3O","sourceware.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com","sourceware.org; spf=pass smtp.mailfrom=redhat.com","server2.sourceware.org;\n arc=none smtp.remote-ip=170.10.129.124"],"Received":["from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g2Jz76B6Tz1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 25 Apr 2026 02:57:07 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 0DFE74B920D0\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 24 Apr 2026 16:57:06 +0000 (GMT)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.129.124])\n by sourceware.org (Postfix) with ESMTP id 3AC7E4BB3BC3\n for <gcc-patches@gcc.gnu.org>; Fri, 24 Apr 2026 16:56:33 +0000 (GMT)","from mail-qt1-f198.google.com (mail-qt1-f198.google.com\n [209.85.160.198]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-251-Qt-nkKcUPh-FCpeRHorBlA-1; Fri, 24 Apr 2026 12:56:29 -0400","by mail-qt1-f198.google.com with SMTP id\n d75a77b69052e-50e67a4f642so41100521cf.0\n for <gcc-patches@gcc.gnu.org>; Fri, 24 Apr 2026 09:56:29 -0700 (PDT)","from [192.168.50.130]\n (130-44-146-247.s12789.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com.\n [130.44.146.247]) by smtp.gmail.com with ESMTPSA id\n 6a1803df08f44-8b02ac4260bsm186871906d6.4.2026.04.24.09.56.27\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Fri, 24 Apr 2026 09:56:27 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 0DFE74B920D0","OpenDKIM Filter v2.11.0 sourceware.org 3AC7E4BB3BC3"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 3AC7E4BB3BC3","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 3AC7E4BB3BC3","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1777049793; cv=none;\n b=RIQY05aKe0y18O/IisyWpN2+aHgrdgwqy1JflcaKK8wwIrkoEEeLbMKs4fFHOxW4i5LlooQI80wHCNFcqc50wXbqNlBfLEYbOsbHLVZ1jc/8TyNlHSUYWPFptClKXPaDLolOu1PMPL6JkjKxbTdm4ijTfKM2p6R5iq3RKzD60ZM=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1777049793; c=relaxed/simple;\n bh=ZGe9+HsWWiyL5F1n4/RFul8Vfnzt135LiPv7tEr6WVg=;\n h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:To:From;\n b=dO9Mlp7yXAlfKD+6eT0TqQ7wGVbTDIY8yshUztMw9zM8dqNMkdrQo3+uZF7h2/yKkFzd6l7VVFHBuiuohdry8O+5DpTFPpKhice41nxmu2CSwBQKhqqUNRF033ERN+wnXFo7LpWTzLHVClxTV4KS6YVJwHpK8/Qmc6ggdJViF1M=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1777049792;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=LEVVFrYZ4jKLX5TiLEXgbv0ANMZ2lqP477nXjxCoHb8=;\n b=aVcbgl3OdxUaHIHNxm4YADO5QAjHUCssWG5xMhID4/Jf7bo/uTDHhJmNBVE1KHD/gF2XQj\n gEBLFIK7HtQb9NiFgXHDwhCjjapcdctOagCuKhlJzjeY35iaVVnPTMS1SZTYR/OuUFQrnL\n fbyO48jNqm/eDXs5J4fZXJAeSulLRZ8=","X-MC-Unique":"Qt-nkKcUPh-FCpeRHorBlA-1","X-Mimecast-MFC-AGG-ID":"Qt-nkKcUPh-FCpeRHorBlA_1777049788","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1777049788; x=1777654588;\n h=content-transfer-encoding:in-reply-to:from:content-language\n :references:cc:to:subject:user-agent:mime-version:date:message-id\n :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n :reply-to;\n bh=LEVVFrYZ4jKLX5TiLEXgbv0ANMZ2lqP477nXjxCoHb8=;\n b=bF5FN9onSqcdyLa16WVteynLDkAwJNW+My/SJ+uVAzIWfueQiFruP4sYlaGHGTMJiI\n Qu+d/iJt84pv5hvu7azjSgJxWK8pkJEkuyWSEjoib5ZvW0kZa0CtmsT2FXZ9UwgWPRtU\n 4WM+M38iCCoveROIVOVjRVxLB5Cs1Vvc5d2bkTDJiXQVTaeqNlOZpbrm2yYtUyiG8lR6\n eY+qXyByfYalhm3XV1DDMCSknp8nvwbEjJqTwxWhuuFeZ56RAUHt716bVAokoMP0QiCI\n F6fi4izlfyqPc8fkDUAiwYgoZ5ZWJDYjaU67a5KboxbpFiWMr9387OVYwvh155B5zb4N\n Ndqg==","X-Forwarded-Encrypted":"i=1;\n AFNElJ9CHJzQVFR4hR0TJ5l/vayMBeDnzolAyE3YaSTFZUeo/BoteeVM/JDcPPX57lpgI4Kve5TaZhby4oorcA==@gcc.gnu.org","X-Gm-Message-State":"AOJu0YzHn/zLv1Gix677ut+L+eCLB6KL40C+iIml6KgzNuU0WBYLzOF8\n Ew/n2qlSFknF51Hqb0NsmAa+33PhXynofhrsEtcDkozubscWj4HjU826rHqna2JJd1onSqfp5O3\n offIAQMM3BTisA+fGxSRzoeZ0UoQqBz9GcjX2SbbTzXynU7Med75zehoA5Xw=","X-Gm-Gg":"AeBDiesa+IsU7J2d6EGQFcqiBySRA59YJddr2jLUQEu79FrGydV2zbAdtMJNThYgvnf\n 8Db6zKve6OVYPEBwbj0zrZAzX0qbHnG5lmtacglj5ewandtYaMOm38QSD497qPzdSY/dfhJg06d\n JQNCOu8hfyPxGv1/OhWZjHuJ5O0NARQUL1yqfQnlFKgazXB9Ll83s5aTmlSY3Rkchs9sVNSaML4\n SZJBhiHXoZeeiYVjqS/A3/x5A+28v9kdWBtUuJXMgGZ4YuxFQ6JL1hBgwv3TN/NJXQNJlbQ4YCW\n QTyqP/VFYz3s8UgoyruOigffw1nJRF8iN8YQqEZ38fbuFrsbc2foWZdzIpkKE9Xqefb4zdu00vg\n LLXKE+LqGZgYQxjWa5MDMpgGlgeYRwFHRecQPs0oXkqelX3JUoFlV4fHAK4fuuMOOwXcH5IAFBA\n GzV3iBFpIO37QNAUe68BFbDkZOENTPnOy7UcZkd29V4A==","X-Received":["by 2002:a05:622a:500b:b0:50e:5ca8:8c2a with SMTP id\n d75a77b69052e-50e5ca89001mr261821281cf.2.1777049788512;\n Fri, 24 Apr 2026 09:56:28 -0700 (PDT)","by 2002:a05:622a:500b:b0:50e:5ca8:8c2a with SMTP id\n d75a77b69052e-50e5ca89001mr261820991cf.2.1777049788004;\n Fri, 24 Apr 2026 09:56:28 -0700 (PDT)"],"Message-ID":"<d9da09b5-d0fa-4e90-be9f-baceb6b8dd91@redhat.com>","Date":"Fri, 24 Apr 2026 12:56:26 -0400","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH] c++/modules: defer completion of streamed-in cNTTPs\n [PR124953]","To":"Patrick Palka <ppalka@redhat.com>, gcc-patches@gcc.gnu.org","Cc":"nshead@gcc.gnu.org","References":"<20260424150116.1751690-1-ppalka@redhat.com>","From":"Jason Merrill <jason@redhat.com>","In-Reply-To":"<20260424150116.1751690-1-ppalka@redhat.com>","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"0YoaITNYX2QYdUax_bbLNYDLdCALYX1HRhTYv1PT6Bw_1777049788","X-Mimecast-Originator":"redhat.com","Content-Language":"en-US","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"}}]