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 [216.205.24.124]) by sourceware.org (Postfix) with ESMTP id 0F7A038708DD for ; Mon, 4 Jan 2021 22:50:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 0F7A038708DD Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-491-b_0HSJkJMqG6xfanrFYCqQ-1; Mon, 04 Jan 2021 17:50:57 -0500 X-MC-Unique: b_0HSJkJMqG6xfanrFYCqQ-1 Received: by mail-qk1-f200.google.com with SMTP id l138so24229959qke.4 for ; Mon, 04 Jan 2021 14:50:57 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=azZhVEK8lSOcE080An5F4XeJC9pOhtcV3hJHg9bphh0=; b=t62T4C98sDYJ5t42lIbhaF1Brqr0N0DYHFfSmveIkCTUS+uRO1kD6HJ3cHnrwDmwcN UVMLUktAoDWZxJElt0F+MMIgUyR+1Sugaeth9gwQq7EZ5P3P3IBGYFTJ9xpiePUt8j4N +c7ASPql5cKI0hDkfy9dgYw1s4OvgRZqMgIcuCbB/s0iqMWZGcURRUUvP55Bfljwf/od 3P4oVoZREmDGSxPQCKDpv2j5DF1hHLGW/D2s7fqZ6wZ54W4pQzbVlI8ADxLkHHND8aIJ djLIMod7rkO1ohFtFB1Nu9wraJwD2UvSBDgZfiqVl4TD4zcck6paNVLqPfroPmem0CpE d9UQ== X-Gm-Message-State: AOAM533oM1WUsnjrolBb2Y4Frkut6kNsXl3PjofGkWX8Ql25hebn8WcK q4f9kRJsaefIRMV0Fh72aTa/nE1598ECoCU+Wy13arQqkycXpvCaLyYw+Bf2VgUMdPW0rcwkVS6 JSOJQkirmCfuyWTf6+NXPq4YMV/fqPK2kRgZxynISg54Hu6G1nJJEcdGS+6f0HAWSVOI= X-Received: by 2002:ac8:4a17:: with SMTP id x23mr76783932qtq.138.1609800656471; Mon, 04 Jan 2021 14:50:56 -0800 (PST) X-Google-Smtp-Source: ABdhPJx3qIIZJE2TnA6tqIZIzyK+mZDMfARwH2wvu6JJTBGYumu9leUJ9Psg9a/nAk9JhuKah/Bcmw== X-Received: by 2002:ac8:4a17:: with SMTP id x23mr76783912qtq.138.1609800656001; Mon, 04 Jan 2021 14:50:56 -0800 (PST) Received: from localhost.localdomain (ool-457d493a.dyn.optonline.net. [69.125.73.58]) by smtp.gmail.com with ESMTPSA id 60sm37209497qth.14.2021.01.04.14.50.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Jan 2021 14:50:55 -0800 (PST) From: Patrick Palka To: gcc-patches@gcc.gnu.org Subject: [PATCH] c++: Fix deduction from the type of an NTTP Date: Mon, 4 Jan 2021 17:50:52 -0500 Message-Id: <20210104225052.3262429-1-ppalka@redhat.com> X-Mailer: git-send-email 2.30.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=-16.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_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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, 04 Jan 2021 22:51:00 -0000 In the testcase nontype-auto17.C below, the calls to f and g are invalid because neither deduction nor defaulting of the template parameter T yields a valid specialization. Deducing T doesn't work because T is only used in a non-deduced context, and defaulting T doesn't work because its default argument makes the type of M invalid. But with -std=c++17 or later, we incorrectly accept both calls. With C++17 (specifically P0127R2), we're allowed to try to deduce T from the argument 42 that's been tentatively deduced for M. The problem is that when unify walks into the type of M, it immediately gives up on the TYPENAME_TYPE and doesn't register any new unifications (so the type of M is still unknown) -- and then we go on to unify M with 42 anyway. Later in type_unification_real, we blindly use the default argument for T to complete the template argument vector, and we end up with the bogus specializations f and g. This patch fixes this issue by checking whether the type of a NTTP is still dependent after walking into the type. If it is, it means we couldn't deduce all the template parameters used in its type, and so we shouldn't yet unify the NTTP. (The new testcase ttp33.C demonstrates the need for the TEMPLATE_PARM_LEVEL check; without it, we would ICE on this testcase from the call to tsubst.) Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for trunk? gcc/cp/ChangeLog: * pt.c (unify) : After walking into the type of the TEMPLATE_PARM_INDEX, substitute into the type a second time. If the type is still dependent, don't unify it. gcc/testsuite/ChangeLog: * g++.dg/template/partial5.C: Adjust directives to expect the same errors across all dialects. * g++.dg/cpp1z/nontype-auto17.C: New test. * g++.dg/cpp1z/nontype-auto18.C: New test. * g++.dg/template/ttp33.C: New test. --- gcc/cp/pt.c | 10 +++++++++- gcc/testsuite/g++.dg/cpp1z/nontype-auto17.C | 10 ++++++++++ gcc/testsuite/g++.dg/cpp1z/nontype-auto18.C | 6 ++++++ gcc/testsuite/g++.dg/template/partial5.C | 2 +- gcc/testsuite/g++.dg/template/ttp33.C | 10 ++++++++++ 5 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1z/nontype-auto17.C create mode 100644 gcc/testsuite/g++.dg/cpp1z/nontype-auto18.C create mode 100644 gcc/testsuite/g++.dg/template/ttp33.C diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 19fd4c1d8a4..f1e8b01bc01 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -23581,13 +23581,21 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict, /* We haven't deduced the type of this parameter yet. */ if (cxx_dialect >= cxx17 /* We deduce from array bounds in try_array_deduction. */ - && !(strict & UNIFY_ALLOW_INTEGER)) + && !(strict & UNIFY_ALLOW_INTEGER) + && TEMPLATE_PARM_LEVEL (parm) <= TMPL_ARGS_DEPTH (targs)) { /* Deduce it from the non-type argument. */ tree atype = TREE_TYPE (arg); RECUR_AND_CHECK_FAILURE (tparms, targs, tparm, atype, UNIFY_ALLOW_NONE, explain_p); + /* Now check whether the type of this parameter is still + dependent, and give up if so. */ + ++processing_template_decl; + tparm = tsubst (tparm, targs, tf_none, NULL_TREE); + --processing_template_decl; + if (uses_template_parms (tparm)) + return unify_success (explain_p); } else /* Try again later. */ diff --git a/gcc/testsuite/g++.dg/cpp1z/nontype-auto17.C b/gcc/testsuite/g++.dg/cpp1z/nontype-auto17.C new file mode 100644 index 00000000000..509eb0e98e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/nontype-auto17.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } + +template struct K { }; + +template int f(K); // { dg-error "void" } +int a = f(K<42>{}); // { dg-error "no match" } + +struct S { using type = void; }; +template int g(K); // { dg-message "deduction" } +int b = g(K<42>{}); // { dg-error "no match" } diff --git a/gcc/testsuite/g++.dg/cpp1z/nontype-auto18.C b/gcc/testsuite/g++.dg/cpp1z/nontype-auto18.C new file mode 100644 index 00000000000..46873672714 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/nontype-auto18.C @@ -0,0 +1,6 @@ +// { dg-do compile { target c++11 } } + +template struct K { }; +struct S { using type = int; }; +template int f(K); +int c = f(K<42>{}); diff --git a/gcc/testsuite/g++.dg/template/partial5.C b/gcc/testsuite/g++.dg/template/partial5.C index a56229770f4..40d8c45b087 100644 --- a/gcc/testsuite/g++.dg/template/partial5.C +++ b/gcc/testsuite/g++.dg/template/partial5.C @@ -14,7 +14,7 @@ template struct Y { }; template -struct Y { }; // { dg-error "" "" { target { ! c++17 } } } +struct Y { }; // { dg-error "" } template diff --git a/gcc/testsuite/g++.dg/template/ttp33.C b/gcc/testsuite/g++.dg/template/ttp33.C new file mode 100644 index 00000000000..cd0de8ca641 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp33.C @@ -0,0 +1,10 @@ +// A slight variation of ttp31.C. +// { dg-do compile { target c++11 } } + +template class TTA, TA... VA> +struct A { }; + +template class TTC, TC... VC> +struct C : A { }; -- 2.30.0