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 ESMTP id 5309E3857C5F for ; Fri, 1 Oct 2021 15:36:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5309E3857C5F Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-418-f-cp-8dfOomsT2uSE902NA-1; Fri, 01 Oct 2021 11:36:42 -0400 X-MC-Unique: f-cp-8dfOomsT2uSE902NA-1 Received: by mail-qt1-f197.google.com with SMTP id w10-20020ac87e8a000000b002a68361412bso15003817qtj.7 for ; Fri, 01 Oct 2021 08:36:42 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:cc:references:from:in-reply-to :content-transfer-encoding; bh=p8gE89dPoeB14sND5XvAcjCrFyK1VUnfoijneAbOteA=; b=UlXfWvQBXEc41nCyXENiA+umR15rfGsZ508Jjds+VWkwJ+KU6A35H5gW4Vx1M260Io N5qSMp8RUoOf3m6scBafjhS0xkWFjZZ09/d+3sKFV535tvZo41Ymuji7w558k96Pf2QB 8aP2PDLOxvTc/I5/q2dIAnudFRbZcHSeyDKl0K1Xbl3zUHfdA+++G0ynsh6jOetRLqcT ViB6mSJ+fkewUKNslOPfDI3vvirAXjW8tCAQ3BqtBkOu155VAadXJBlxN47SHb1CIZWN yNbQ25Nll+guOyaPVd5rFCzKHBQ9dt2TSjhzVcTJO2eb07mjRBKSW0jcNKk/u2pRZN8B 4bBw== X-Gm-Message-State: AOAM5324+RRUP0uajoqgrShYm0A8bvk9c58i/yV4ubATUOdn3CG4NOXS mcah3ylPPWYmXgoyyfcrKYb0biSFR4kYksbGmKAzlEEEtcKQWiSAXO4Qha7bX8bg4fs32ga3laD Fj7MOiGo+uVizxh4xrw== X-Received: by 2002:ac8:404b:: with SMTP id j11mr14273736qtl.140.1633102601268; Fri, 01 Oct 2021 08:36:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJycvUr5dWExLxQteUJBseJRShAGIxscMDCb8dBdVHn6NlMBbeLV47hsehYRBi6SmCLN9CNwZQ== X-Received: by 2002:ac8:404b:: with SMTP id j11mr14273700qtl.140.1633102600957; Fri, 01 Oct 2021 08:36:40 -0700 (PDT) Received: from [192.168.1.149] (130-44-159-43.s15913.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.159.43]) by smtp.gmail.com with ESMTPSA id i11sm2908496qki.28.2021.10.01.08.36.39 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 01 Oct 2021 08:36:39 -0700 (PDT) Message-ID: <8a30a9f4-911b-94f9-680c-0dbb3ba8a7be@redhat.com> Date: Fri, 1 Oct 2021 11:36:39 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.1.2 Subject: Re: [PATCH] c++: unifying equal NONTYPE_ARGUMENT_PACKs [PR102547] To: Patrick Palka Cc: gcc-patches@gcc.gnu.org References: <20211001134643.1941700-1-ppalka@redhat.com> <0e9e4c2f-aadc-6358-72de-a5f3620ebad9@redhat.com> <2ac834ad-fd22-a6be-7bba-ac9badbb484@idea> From: Jason Merrill In-Reply-To: <2ac834ad-fd22-a6be-7bba-ac9badbb484@idea> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-13.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, NICE_REPLY_A, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP 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: Fri, 01 Oct 2021 15:36:44 -0000 On 10/1/21 10:26, Patrick Palka wrote: > On Fri, 1 Oct 2021, Jason Merrill wrote: > >> On 10/1/21 09:46, Patrick Palka wrote: >>> Here during partial ordering of the two partial specializations we end >>> up in unify with parm=arg=NONTYPE_ARGUMENT_PACK, and crash shortly >>> thereafter because uses_template_parms calls potential_constant_expression >>> which doesn't handle NONTYPE_ARGUMENT_PACK. >>> >>> This patch fixes this by checking dependent_template_arg_p instead of >>> uses_template_parms when parm==arg, which does handle NONTYPE_ARGUMENT_PACK. >>> We could also perhaps fix uses_template_parms / inst_dep_expr_p to better >>> handle NONTYPE_ARGUMENT_PACK, >> >> Please. > > Sounds good, like the following then? Passes light testing, bootstrap > and regtest on progress. > > -- >8 -- > > PR c++/102547 > > gcc/cp/ChangeLog: > > * pt.c (instantiation_dependent_expression_p): Sidestep checking > potential_constant_expression on NONTYPE_ARGUMENT_PACK. > > gcc/testsuite/ChangeLog: > > * g++.dg/cpp0x/variadic-partial2.C: New test. > * g++.dg/cpp0x/variadic-partial2a.C: New test. > --- > gcc/cp/pt.c | 4 +++- > .../g++.dg/cpp0x/variadic-partial2.C | 16 ++++++++++++++ > .../g++.dg/cpp0x/variadic-partial2a.C | 22 +++++++++++++++++++ > 3 files changed, 41 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic-partial2.C > create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic-partial2a.C > > diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c > index 1dcdffe322a..643204103c5 100644 > --- a/gcc/cp/pt.c > +++ b/gcc/cp/pt.c > @@ -27705,7 +27705,9 @@ instantiation_dependent_expression_p (tree expression) > { > return (instantiation_dependent_uneval_expression_p (expression) > || (processing_template_decl > - && potential_constant_expression (expression) > + && expression != NULL_TREE > + && (TREE_CODE (expression) == NONTYPE_ARGUMENT_PACK > + || potential_constant_expression (expression)) I'd prefer to loop over the elements of the pack, either here or (probably better) in potential_constant_expression. > && value_dependent_expression_p (expression))); > } > > diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-partial2.C b/gcc/testsuite/g++.dg/cpp0x/variadic-partial2.C > new file mode 100644 > index 00000000000..df61f26a3c1 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-partial2.C > @@ -0,0 +1,16 @@ > +// PR c++/102547 > +// { dg-do compile { target c++11 } } > + > +template > +struct vals { }; > + > +template > +struct vals_client { }; > + > +template > +struct vals_client, T> { }; > + > +template > +struct vals_client, void> { }; > + > +template struct vals_client, void>; //- "sorry, unimplemented..., ICE" > diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-partial2a.C b/gcc/testsuite/g++.dg/cpp0x/variadic-partial2a.C > new file mode 100644 > index 00000000000..cc0ea488ad3 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-partial2a.C > @@ -0,0 +1,22 @@ > +// PR c++/102547 > +// { dg-do compile { target c++11 } } > +// A version of variadic-partial2.C where the partial ordering is performed > +// on function templates instead of class templates. > + > +template > +struct vals { }; > + > +template > +void f(V, T) { }; > + > +template > +void f(vals, T) { }; > + > +template > +void f(vals, char) { }; > + > +template void f(vals<1, 2>, char); //- "sorry, unimplemented..., ICE" > + > +int main() { > + f(vals<1, 3>{}, 'a'); //- "sorry, unimplemented..., ICE" > +} >