From patchwork Wed Feb 12 23:42:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 1237139 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-519449-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha1 header.s=default header.b=RYVbaEk5; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Aqk0Cv3T; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48Hx661VbNz9sPF for ; Thu, 13 Feb 2020 10:43:07 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:date:message-id:content-type :content-transfer-encoding; q=dns; s=default; b=CY2hsccvG7XPVN81 ju4zSRdU3MfYq5lmRTF1V2CAsl+Oj87otJoJsGwseR/6GP+gWLQwPLFxm6emyF/f meKHxdyrDOh4i+L5oQtlizoKQjZawZyWbFbpQDmC+vsXeGToBiKa61MyDMmZ02ar AlHFxny5v8bIOHY1r7DUIElFwgo= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:date:message-id:content-type :content-transfer-encoding; s=default; bh=UqmUbCpFfT/TSNdjT1kA6J DFz+g=; b=RYVbaEk5tdbL5aIX/hY/FHpHBkplukp4gvdQ8sBwc4ajdoeaogKeVL Z0g+Tpb/FnOmBU+d99hMVeQqxxEyusfJ/coIVlAOFpJSEPNH+Zc6hIZ9uGY24re7 gDAPaMpW0NjphcbWfPgxiybPMohuw4ZOeIH5OeYB6pfPH3I+TiHrk= Received: (qmail 42722 invoked by alias); 12 Feb 2020 23:43:00 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 42710 invoked by uid 89); 12 Feb 2020 23:42:59 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.3 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 spammy=92583 X-HELO: us-smtp-1.mimecast.com Received: from us-smtp-1.mimecast.com (HELO us-smtp-1.mimecast.com) (205.139.110.61) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 12 Feb 2020 23:42:58 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1581550976; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=kyyyekPvEevUhgX4f9KqithQqeJ3Di3sTzEZCATsylQ=; b=Aqk0Cv3TfV2fjwoIiuAM00Xl5lH1GcgAsnQldqXXstz4WnNTtTLwkdOnZGjQ4w2pjfE0uR /4trNCDXrIpvd9EWJgrKmaYJPT5SZJJOQ/+KrSuo2EzbbU48C4XzkMk4B8QBB8kD7OSgtQ 5PMV6aF2gxg6VgBSWfPGKJ4Ks5MZPtw= Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-22-_mt-b5DRPS6AMmHZGnA9rQ-1; Wed, 12 Feb 2020 18:42:55 -0500 Received: by mail-wr1-f71.google.com with SMTP id u8so1521601wrp.10 for ; Wed, 12 Feb 2020 15:42:54 -0800 (PST) Received: from barrymore.cygnus.csb ([193.85.242.99]) by smtp.gmail.com with ESMTPSA id n1sm432411wrw.52.2020.02.12.15.42.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Feb 2020 15:42:52 -0800 (PST) From: Jason Merrill To: gcc-patches@gcc.gnu.org Subject: [committed] c++: Fix constexpr if and braced functional cast. Date: Thu, 13 Feb 2020 00:42:50 +0100 Message-Id: <20200212234250.11088-1-jason@redhat.com> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-IsSubscribed: yes While partially instantiating a generic lambda, we can encounter pack expansions or constexpr if where we can't actually do the substitution immediately, and instead remember a partial instantiation context in *_EXTRA_ARGS. This includes any local_specializations used in the pattern or condition. In this testcase our tree walk wasn't finding the use of i because we weren't walking into the type of a CONSTRUCTOR. Fixed by moving the code for doing that from find_parameter_packs_r into cp_walk_subtrees. Tested x86_64-pc-linux-gnu, applying to trunk. 2020-02-11 Jason Merrill PR c++/92583 PR c++/92654 * tree.c (cp_walk_subtrees): Walk CONSTRUCTOR types here. * pt.c (find_parameter_packs_r): Not here. --- gcc/cp/pt.c | 3 --- gcc/cp/tree.c | 5 ++++ gcc/testsuite/g++.dg/cpp0x/nondeduced7.C | 2 +- .../g++.dg/cpp1z/constexpr-if-lambda3.C | 24 +++++++++++++++++++ 4 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1z/constexpr-if-lambda3.C base-commit: 1cd9bef89ef25b3fd506cedbc82e8bc00ff56fa8 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index c2d3a98b1c5..6e7f4555da8 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -3924,9 +3924,6 @@ find_parameter_packs_r (tree *tp, int *walk_subtrees, void* data) case TEMPLATE_DECL: if (!DECL_TEMPLATE_TEMPLATE_PARM_P (t)) return NULL_TREE; - gcc_fallthrough(); - - case CONSTRUCTOR: cp_walk_tree (&TREE_TYPE (t), &find_parameter_packs_r, ppd, ppd->visited); return NULL_TREE; diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index eb540f851ee..736ef6fe667 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -5024,6 +5024,11 @@ cp_walk_subtrees (tree *tp, int *walk_subtrees_p, walk_tree_fn func, *walk_subtrees_p = 0; break; + case CONSTRUCTOR: + if (COMPOUND_LITERAL_P (*tp)) + WALK_SUBTREE (TREE_TYPE (*tp)); + break; + case TRAIT_EXPR: WALK_SUBTREE (TRAIT_EXPR_TYPE1 (*tp)); WALK_SUBTREE (TRAIT_EXPR_TYPE2 (*tp)); diff --git a/gcc/testsuite/g++.dg/cpp0x/nondeduced7.C b/gcc/testsuite/g++.dg/cpp0x/nondeduced7.C index a8aa073c57e..eb5d5faf493 100644 --- a/gcc/testsuite/g++.dg/cpp0x/nondeduced7.C +++ b/gcc/testsuite/g++.dg/cpp0x/nondeduced7.C @@ -2,5 +2,5 @@ // { dg-do compile { target c++11 } } template struct A; -template struct A {}; // { dg-error "partial specialization" } +template struct A {}; // { dg-error "partial specialization|involves template parameter" } A a; diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-if-lambda3.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-if-lambda3.C new file mode 100644 index 00000000000..34615f71ee2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-if-lambda3.C @@ -0,0 +1,24 @@ +// PR c++/92583 +// { dg-do compile { target c++17 } } + +template struct a { + constexpr operator int() { return 42; } +}; +template using b = int; +template struct e {}; +template using h = e; +template void apply(j f, e) { + (f(a{}), ...); +} +template void m(j f) { + using k = b; + using n = h; + apply(f, n{}); +} +template void o() { + auto p = [](auto i) { + if constexpr (a{}) ; + }; + m(p); +} +auto q() { o<0, 1>; }