From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) by sourceware.org (Postfix) with ESMTP id D96C43857C40 for ; Wed, 5 Aug 2020 00:00:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org D96C43857C40 Received: from mail-qk1-f198.google.com (mail-qk1-f198.google.com [209.85.222.198]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-412-QFroQ486NHWHF7mi_hNG0Q-1; Tue, 04 Aug 2020 20:00:35 -0400 X-MC-Unique: QFroQ486NHWHF7mi_hNG0Q-1 Received: by mail-qk1-f198.google.com with SMTP id a130so28739308qkg.9 for ; Tue, 04 Aug 2020 17:00:35 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:date:to:cc:subject:in-reply-to:message-id :references:mime-version; bh=OlVN9EdvXUjOeT7Tnq3DLukPiJfh2Wo1koj93U87ZrI=; b=rM7xtQ3QUnaNOuGH31oxPBgZVCeu9D+McL7SbUZAaUK5+Q6CMx0V2c9DqLqBxoaYTV +0IxASOYn2b3RQJ70HIc5xLOBhHf8orNckhMcdRb5nj9n/+1V9MV3EYhqmnmNKYf8u0r Sv0L0Hn3JGlROvQd9pRkEA0AzH89dUmnDpQEVAt9JPwiG+oOCaraJEqakqdR+hHXAcmX opsUqppHxRRm5s6c6qBZDuNRQjjCg0Ymv8r2I2yigs+QUN9FrVDJngOQCO+yUyXzVQqJ WMWMEBjNVoyhwwg5l9aDcEAIm9LLyVWHWMn6Bq1UTTDXE3sN1tbvtNZW4sQc7sdkKsVl qlvw== X-Gm-Message-State: AOAM532KDV9e8ufsuieWemW06EaD63W0obCaNQ+aRjLD2W5euHE9MnEM 7FEEqOn5GAz43m71sOK5U+CgrjA3r/Uf2A4txiYr2aHDyDJfaK1Hvj/4g6ZRLFN9gZDKK1M24An 0S72QSdiobjiT/doRqQ== X-Received: by 2002:a37:a291:: with SMTP id l139mr711184qke.117.1596585634939; Tue, 04 Aug 2020 17:00:34 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyErHseZIIKTr1J3C3qzCfZnwGc242OU207Ev90AVVOK8/7KHifK2YdMXOfe1jtWbyA8cjugQ== X-Received: by 2002:a37:a291:: with SMTP id l139mr711166qke.117.1596585634631; Tue, 04 Aug 2020 17:00:34 -0700 (PDT) Received: from [192.168.1.130] (ool-457d493a.dyn.optonline.net. [69.125.73.58]) by smtp.gmail.com with ESMTPSA id e129sm250835qkf.132.2020.08.04.17.00.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Aug 2020 17:00:33 -0700 (PDT) From: Patrick Palka X-Google-Original-From: Patrick Palka Date: Tue, 4 Aug 2020 20:00:32 -0400 (EDT) To: Patrick Palka cc: gcc-patches@gcc.gnu.org, jason@redhat.com Subject: Re: [PATCH] c++: dependent constraint on placeholder return type [PR96443] In-Reply-To: <20200804192234.2282332-1-ppalka@redhat.com> Message-ID: References: <20200804192234.2282332-1-ppalka@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=US-ASCII X-Spam-Status: No, score=-16.7 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_H2, 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: Wed, 05 Aug 2020 00:00:39 -0000 On Tue, 4 Aug 2020, Patrick Palka wrote: > In the testcase below, we never substitute function-template arguments > into f15's placeholder-return-type constraint, which leads to us > incorrectly rejecting this instantiation in do_auto_deduction due to > satisfaction failure (of the constraint SameAs). > > The fact that we incorrectly reject this testcase is masked by the > other instantiation f15, which we correctly reject and diagnose > (by accident). > > A good place to do this missing substitution seems to be during > TEMPLATE_TYPE_PARM level lowering. So this patch adds a call to > tsubst_constraint there, and also adds dg-bogus directives to this > testcase wherever we expect instantiation to succeed. (So without the > substitution fix, this last dg-bogus would FAIL). > > Successfully tested on x86_64-pc-linux-gnu, and also on the cmcstl2 and > range-v3 projects. Does this look OK to commit? > > gcc/cp/ChangeLog: > > PR c++/96443 > * pt.c (tsubst) : Substitute into > the constraints on a placeholder type when its level. > > gcc/testsuite/ChangeLog: > > PR c++/96443 > * g++.dg/cpp2a/concepts-ts1.C: Add dg-bogus wherever we expect > instantiation to succeed. Looking back at this patch with fresh eyes, I realized that the commit message is not the best. I rewrote the commit message to hopefully be more coherent below: -- >8 -- Subject: [PATCH] c++: dependent constraint on placeholder return type [PR96443] In the testcase concepts-ts1.C, we're incorrectly rejecting the call to 'f15(0)' due to satisfaction failure of the function's placeholder-return-type constraint. The testcase doesn't spot this rejection because the error we emit for the constraint failure points to f15's return statement instead of the call site, and we already have a dg-error at the return statement to verify the (correct) rejection of the call f15('a'). So in order to verify that we indeed accept the call 'f15(0)', we need to add a dg-bogus directive at the call site to look for the "required from here" diagnostic line that generally accompanies an instantiation failure. As for why satisfaction failure occurs, it turns out that we never substitute the template arguments of a function template specialization in to its placeholder-return-type constraint. So in this case during do_auto_deduction, we end up checking satisfaction of the still-dependent constraint SameAs from do_auto_deduction, which fails because it's dependent. A good place to do this missing substitution seems to be during TEMPLATE_TYPE_PARM level lowering; so this patch adds a call to tsubst_constraint there. Successfully tested on x86_64-pc-linux-gnu, and also on the cmcstl2 and range-v3 projects. Does this look OK to commit? gcc/cp/ChangeLog: PR c++/96443 * pt.c (tsubst) : Substitute into the constraints on a placeholder type when reducing its level. gcc/testsuite/ChangeLog: PR c++/96443 * g++.dg/cpp2a/concepts-ts1.C: Add dg-bogus to the call to f15 that we expect to accept. --- gcc/cp/pt.c | 7 ++++--- gcc/testsuite/g++.dg/cpp2a/concepts-ts1.C | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e7496002c1c..9f3426f8249 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -15524,10 +15524,11 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) if (TREE_CODE (t) == TEMPLATE_TYPE_PARM) { - /* Propagate constraints on placeholders since they are - only instantiated during satisfaction. */ + /* Substitute constraints on placeholders when reducing + their level. */ if (tree constr = PLACEHOLDER_TYPE_CONSTRAINTS (t)) - PLACEHOLDER_TYPE_CONSTRAINTS (r) = constr; + PLACEHOLDER_TYPE_CONSTRAINTS (r) + = tsubst_constraint (constr, args, complain, in_decl); else if (tree pl = CLASS_PLACEHOLDER_TEMPLATE (t)) { pl = tsubst_copy (pl, args, complain, in_decl); diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-ts1.C b/gcc/testsuite/g++.dg/cpp2a/concepts-ts1.C index 1cefe3b243f..a116cac4ea4 100644 --- a/gcc/testsuite/g++.dg/cpp2a/concepts-ts1.C +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-ts1.C @@ -40,7 +40,7 @@ void driver() f3('a'); // { dg-error "" } f4(0, 0); f4(0, 'a'); // { dg-error "" } - f15(0); + f15(0); // { dg-bogus "" } f15('a'); // { dg-message "" } } -- 2.28.0.89.g85b4e0a6dc