From patchwork Wed Sep 13 17:53:31 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Palka X-Patchwork-Id: 75888 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 76B4A3858C5F for ; Wed, 13 Sep 2023 17:54:06 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 76B4A3858C5F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1694627646; bh=/4WodTiCEhHhRQDpS4akf+fdSDExRyVJovRoEtauX8w=; h=To:Cc:Subject:Date:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=phfzfYvOKy9WcFPdIn0sLIcqklOmnGjriGaVILSQ9a5fMuh5n9whJeEiFKpKigmhj i9vOStLZ1nsvdi++d4PcoXL4GEvSUrYXhaCvnZZUpIuValIR2G/f2DSv80RBZANP6c 6gNMaHzUeSAYM1NwMdx497BqIDtGARL1NYhA0i5Q= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 901CC3858402 for ; Wed, 13 Sep 2023 17:53:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 901CC3858402 Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-453-1iyp_BEUOWyNTDvxQUMkXQ-1; Wed, 13 Sep 2023 13:53:35 -0400 X-MC-Unique: 1iyp_BEUOWyNTDvxQUMkXQ-1 Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-76e1a6a107eso11857585a.3 for ; Wed, 13 Sep 2023 10:53:35 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694627614; x=1695232414; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=/4WodTiCEhHhRQDpS4akf+fdSDExRyVJovRoEtauX8w=; b=Y36I6hiisJ4hFSjBJXUKBQA7DfAtSRH8TxYurSPoURAqvCUb1rCUtkQaFpazofsRam KDIuo8o7r/fpDxJ6/RGA2JD6jkVm7HZGvYl/F1o/s+rbl2k5QtLqTddpkd25jb1DIUWg kMZhvExwNsPcNnDSpu40hTWoJpFVRMWZUSpl/7FEvXsccSZksSb4WXPCvTar62cTgbc3 Eoq+AXzYtRzgkwyXBjZr7Vb1IkfcgyZUnL3meqdzgiJ8N9URZlEZblu8wKJVOVp3oeyt CNTCBEY9c4xadGQE+soswMagSRdfTOsqs+K4jRhzR/Mlu9uZDwL4JZWdL2tGD2tV0Z7m 5/JQ== X-Gm-Message-State: AOJu0YyfX5ESemlD1xjM2bGCywzmUr6M5g98qUQXoaAuTdZOsvqKeEv8 8jMkXuXxwYKwWmlg2DZPZ72P9St4jDbV7Jeg8euHMs0GTJklq66ZzsivIszQkE0aVIQO+rTgGqE EKWk0T9rYbrBL7CXBPZtmnUyDC2ZFcfaLcMD0P34MgvbVLYFtmpaasiGp4wVkyo5M56km5PlGA3 g= X-Received: by 2002:a05:620a:670:b0:76d:b5ce:8f79 with SMTP id a16-20020a05620a067000b0076db5ce8f79mr2478491qkh.34.1694627614182; Wed, 13 Sep 2023 10:53:34 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGQf1Fcn4Zor68J7t2JRWSLY2zaoe1ELD98NTDznstolUHNDmwavuVGAnpxFD6d+JlXEQBKhw== X-Received: by 2002:a05:620a:670:b0:76d:b5ce:8f79 with SMTP id a16-20020a05620a067000b0076db5ce8f79mr2478475qkh.34.1694627613740; Wed, 13 Sep 2023 10:53:33 -0700 (PDT) Received: from localhost.localdomain (ool-457670bb.dyn.optonline.net. [69.118.112.187]) by smtp.gmail.com with ESMTPSA id v12-20020ac8578c000000b0040ff6194ef3sm4173093qta.70.2023.09.13.10.53.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Sep 2023 10:53:33 -0700 (PDT) To: gcc-patches@gcc.gnu.org Cc: jason@redhat.com, Patrick Palka Subject: [PATCH] c++: optimize unification of class specializations [PR89231] Date: Wed, 13 Sep 2023 13:53:31 -0400 Message-ID: <20230913175331.4084179-1-ppalka@redhat.com> X-Mailer: git-send-email 2.42.0.158.g94e83dcf5b MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-13.6 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_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, 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: , X-Patchwork-Original-From: Patrick Palka via Gcc-patches From: Patrick Palka Reply-To: Patrick Palka Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for trunk? -- >8 -- Since the LHS of a qualified-id is a non-deduced context, it effectively means we can't deduce from outer template arguments of a class template specialization. And checking for equality between the TI_TEMPLATE of a class specialization parm/arg already implies that the outer template arguments are the same. Hence recursing into outer template arguments during unification of class specializations is redundant, so this patch makes unify recurse only into innermost arguments. This incidentally fixes the testcase from PR89231 because there more_specialized_partial_inst considers the two partial specializations to be unordered ultimately because unify for identical parm=arg=A::Collect gets confused when it recurses into parm=arg={Ps...} since the level of Ps doesn't match the innermost level of tparms that we're actually deducing. PR c++/89231 gcc/cp/ChangeLog: * pt.cc (try_class_unification): Strengthen TI_TEMPLATE equality test by not calling most_general_template. Only unify the innermost levels of template arguments. (unify) : Only unify the innermost levels of template arguments. Don't unify template arguments if the template is not primary. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/variadic-partial3.C: New test. --- gcc/cp/pt.cc | 17 +++++++++++------ .../g++.dg/cpp0x/variadic-partial3.C | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic-partial3.C diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 838179d5fe3..c88e9cd0fa6 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -23999,8 +23999,7 @@ try_class_unification (tree tparms, tree targs, tree parm, tree arg, return NULL_TREE; else if (TREE_CODE (parm) == BOUND_TEMPLATE_TEMPLATE_PARM) /* Matches anything. */; - else if (most_general_template (CLASSTYPE_TI_TEMPLATE (arg)) - != most_general_template (CLASSTYPE_TI_TEMPLATE (parm))) + else if (CLASSTYPE_TI_TEMPLATE (arg) != CLASSTYPE_TI_TEMPLATE (parm)) return NULL_TREE; /* We need to make a new template argument vector for the call to @@ -24041,8 +24040,10 @@ try_class_unification (tree tparms, tree targs, tree parm, tree arg, if (TREE_CODE (parm) == BOUND_TEMPLATE_TEMPLATE_PARM) err = unify_bound_ttp_args (tparms, targs, parm, arg, explain_p); else - err = unify (tparms, targs, CLASSTYPE_TI_ARGS (parm), - CLASSTYPE_TI_ARGS (arg), UNIFY_ALLOW_NONE, explain_p); + err = unify (tparms, targs, + INNERMOST_TEMPLATE_ARGS (CLASSTYPE_TI_ARGS (parm)), + INNERMOST_TEMPLATE_ARGS (CLASSTYPE_TI_ARGS (arg)), + UNIFY_ALLOW_NONE, explain_p); return err ? NULL_TREE : arg; } @@ -25167,11 +25168,15 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict, /* There's no chance of unification succeeding. */ return unify_type_mismatch (explain_p, parm, arg); - return unify (tparms, targs, CLASSTYPE_TI_ARGS (parm), - CLASSTYPE_TI_ARGS (t), UNIFY_ALLOW_NONE, explain_p); + if (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t))) + return unify (tparms, targs, + INNERMOST_TEMPLATE_ARGS (CLASSTYPE_TI_ARGS (parm)), + INNERMOST_TEMPLATE_ARGS (CLASSTYPE_TI_ARGS (t)), + UNIFY_ALLOW_NONE, explain_p); } else if (!same_type_ignoring_top_level_qualifiers_p (parm, arg)) return unify_type_mismatch (explain_p, parm, arg); + return unify_success (explain_p); case METHOD_TYPE: diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-partial3.C b/gcc/testsuite/g++.dg/cpp0x/variadic-partial3.C new file mode 100644 index 00000000000..5af60711320 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-partial3.C @@ -0,0 +1,19 @@ +// PR c++/89231 +// { dg-do compile { target c++11 } } + +template +struct A { + template + struct Collect { }; + + template> + struct Seq; + + template + struct Seq> : Seq> { }; + + template + struct Seq<0, I, Collect> : Collect { }; +}; + +A::Seq<4> test;