From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id CE9143948821 for ; Mon, 31 Jan 2022 16:07:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org CE9143948821 Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-544-Xxj-xHFcPXW7sykdKU1JuQ-1; Mon, 31 Jan 2022 11:07:33 -0500 X-MC-Unique: Xxj-xHFcPXW7sykdKU1JuQ-1 Received: by mail-qt1-f200.google.com with SMTP id h5-20020ac87765000000b002cff8751c63so10653182qtu.3 for ; Mon, 31 Jan 2022 08:07:32 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=QhazLHuTK6YmTOQ8ctqnG5pJtNDnVrn4HwjOEl48N1Y=; b=v4DQOWw6SqgTlnaJg+IELT0xfn1WRBnPrwyIzmOgEKBpdy/j92a47lRrk7sgTO3ONK uKVxv8FRrxaQUjnsrYEWt7sjEdpapXxFnkwJCeKkxhQr15w1YLspV15h4DqbJwnJLhV3 aSL+IuIeO+6E0V/oGqmsln4BMkrhmtGJadtlqVjbqW44rgrgmjtp85yVrsZkFOHpSe9z e9a6ubvrUfMbnJ6a5mU3si+dR2fQb2b7TDGl1togM2MPhP7/9oAV83ap2SCekmNA0zUV Tv1sype8/9cvaHk8n40cgnR9vJlJr+Jag9mwQvR7JBC1Ln5YPsO/1f04AkIETAVJ1H9x hcKQ== X-Gm-Message-State: AOAM5327sfj1V3P/GcgFMMwhV5Jy+w7+2FTar0Wj4r1LSw3l7Lfpj2v2 /DPmB4yD95dfbxE3wlqMybhnmupdzFZkvHi1PXJoDCdtGqaJAvh4AjoCdRR4u6F8uzpqRDEKkdf 56qH0IhKce/nQO8Ujdq3XJca12uceGAy6Ilob9PwVs4EW/4vRauuK5fil2MQuD9atfOc= X-Received: by 2002:a05:6214:20ea:: with SMTP id 10mr19041458qvk.54.1643645251924; Mon, 31 Jan 2022 08:07:31 -0800 (PST) X-Google-Smtp-Source: ABdhPJyQCFVP2zd/9m2plgKhOB6HCiEWbQm5/YjisRXe3CwxsKs15zQhumhWHx4ldSbYNT2iwxBHOQ== X-Received: by 2002:a05:6214:20ea:: with SMTP id 10mr19041435qvk.54.1643645251611; Mon, 31 Jan 2022 08:07:31 -0800 (PST) Received: from localhost.localdomain (ool-18e40894.dyn.optonline.net. [24.228.8.148]) by smtp.gmail.com with ESMTPSA id f20sm1569401qtf.39.2022.01.31.08.07.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Jan 2022 08:07:30 -0800 (PST) From: Patrick Palka To: gcc-patches@gcc.gnu.org Subject: [PATCH] c++: CTAD for class tmpl defined inside partial spec [PR104294] Date: Mon, 31 Jan 2022 11:07:28 -0500 Message-Id: <20220131160728.1761950-1-ppalka@redhat.com> X-Mailer: git-send-email 2.35.0 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII" X-Spam-Status: No, score=-14.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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-List-Received-Date: Mon, 31 Jan 2022 16:07:41 -0000 Here during deduction guide generation for the nested class template B::C, the computation of outer_targs yields the template arguments relative to the primary template for B (i.e. {char(int)}) but what we really what is those relative to the enclosing scope, the partial specialization of B (i.e. {char, int}). Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for trunk? PR c++/104294 gcc/cp/ChangeLog: * pt.cc (ctor_deduction_guides_for): Correct computation of outer_targs. gcc/testsuite/ChangeLog: * g++.dg/cpp1z/class-deduction106.C: New test. --- gcc/cp/pt.cc | 4 +++- .../g++.dg/cpp1z/class-deduction106.C | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp1z/class-deduction106.C diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index f46a7ad6655..0fe0ad4e44e 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -29568,7 +29568,9 @@ ctor_deduction_guides_for (tree tmpl, tsubst_flags_t complain) if (DECL_CLASS_SCOPE_P (tmpl) && CLASSTYPE_TEMPLATE_INSTANTIATION (DECL_CONTEXT (tmpl))) { - outer_args = CLASSTYPE_TI_ARGS (DECL_CONTEXT (tmpl)); + outer_args = copy_node (CLASSTYPE_TI_ARGS (type)); + gcc_assert (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (outer_args)); + --TREE_VEC_LENGTH (outer_args); type = TREE_TYPE (most_general_template (tmpl)); } diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction106.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction106.C new file mode 100644 index 00000000000..382f6b70ef5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction106.C @@ -0,0 +1,19 @@ +// PR c++/104294 +// { dg-do compile { target c++17 } } + +template +struct B; + +template +struct B { + template + struct C { C(T); }; + + C(decltype(nullptr)) -> C; +}; + +using ty1 = decltype(B::C{0}); +using ty1 = B::C; + +using ty2 = decltype(B::C{nullptr}); +using ty2 = B::C; -- 2.35.0