From patchwork Mon Apr 5 19:38:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 1462523 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=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=eJXbdbOh; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4FDgtz43Pkz9sSC for ; Tue, 6 Apr 2021 05:38:34 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 3261C3857C5E; Mon, 5 Apr 2021 19:38:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3261C3857C5E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1617651511; bh=y/YUffvokZdOIU8+RV5cQWXlM5rmqsBnCFC8buF07RE=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=eJXbdbOhfGz0uaCRwchUNksZM95KTmDCutQKL0cpsaI4zQSZ5UYuxQtJpG6vp9hWa Mps4HYsyo7Zo092zNry+9XXGyL8ttPbKsFj3Bb23oVquu14+OUWPI4BsQHqe17NZNX wXXweSJIkOR1peXS9DA6NLQ/ZE7xl1qpAa+oAOdc= 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 [216.205.24.124]) by sourceware.org (Postfix) with ESMTP id E26D23858031 for ; Mon, 5 Apr 2021 19:38:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org E26D23858031 Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-313-sd3NhyU4PFGvf45eTcXUcQ-1; Mon, 05 Apr 2021 15:38:26 -0400 X-MC-Unique: sd3NhyU4PFGvf45eTcXUcQ-1 Received: by mail-qk1-f197.google.com with SMTP id 130so11189647qkm.0 for ; Mon, 05 Apr 2021 12:38:26 -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:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=y/YUffvokZdOIU8+RV5cQWXlM5rmqsBnCFC8buF07RE=; b=kmee5bsmELINKXLgnGJlcj2bDUiio1yVsw6iXrg3bGRitc32fxBeiLU52MbPik0iv2 boM2kYfDbjFXybl5PkwRcgjAjlL4zuB3hYFQp6jEdzmvZz+HA/YsOrikk9XXZELhU8C2 2I/98hWfa7jc5SQMjtyAcgWRZ93c0OUyvt9odDBEHQqGCRqAgCf03f5jMIljikXa4UcA 6ZHlh2+1+NbEZyUcxdciJMLfls+zSUVysR/l7Z/3sNPAL13J9SGJ2bi32F9VBjb5Lb1M 1SZ/AfK56uQiZlSqWFm0+KizRme1+WFh/oHcYC3jkjy66DJBHyadI25d5/ZrET4ReUl0 saqA== X-Gm-Message-State: AOAM531cExPGQUb8A26QeQzmwp4B8uObmq3p5eIZBKdkGRb8Q6Sw+Ksn 5pmKBSj1pbNq9xiTIV7v31v65nTUKy4dXXzvDRnzxfNt64Mmv6g762grj30Wd7LbSBmRYbYI0iT Sona0YqqqvT+Kfacg2DjcIXO/kWK4+JnGEnHekR715SklDzffsWi+8cfMlPHYSZP/RQ== X-Received: by 2002:ac8:7089:: with SMTP id y9mr23517592qto.264.1617651506096; Mon, 05 Apr 2021 12:38:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyPGRjxyvlVpxKa4t2tRN2LUOYmOZyo827LdZwCdSjbOfPcF8vIXagTU9dTos7ma7OXZsmJpQ== X-Received: by 2002:ac8:7089:: with SMTP id y9mr23517568qto.264.1617651505669; Mon, 05 Apr 2021 12:38:25 -0700 (PDT) Received: from barrymore.redhat.com (209-6-216-142.s141.c3-0.smr-cbr1.sbo-smr.ma.cable.rcncustomer.com. [209.6.216.142]) by smtp.gmail.com with ESMTPSA id w5sm14155221qkc.85.2021.04.05.12.38.24 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Apr 2021 12:38:25 -0700 (PDT) To: gcc-patches@gcc.gnu.org Subject: [pushed] c++: lambda in DMI in class template [PR95870] Date: Mon, 5 Apr 2021 15:38:22 -0400 Message-Id: <20210405193822.1061490-1-jason@redhat.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-15.5 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_H4, 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-Patchwork-Original-From: Jason Merrill via Gcc-patches From: Jason Merrill Reply-To: Jason Merrill Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" Here enclosing_instantiation_of was failing to find a match because otctx is struct S and current_function_decl is S::S(), so the latter has more function contexts, and we end up trying to compare S() to NULL_TREE. After spending a bit of time working on establishing the correspondence in this case (class <=> constructor), it occurred to me that we could just use DECL_SOURCE_LOCATION, which is unique for lambdas, since they cannot be redeclared. Since we're so close to release, for now I'm only doing this for the case that was failing before. Tested x86_64-pc-linux-gnu, applying to trunk. gcc/cp/ChangeLog: PR c++/95870 * pt.c (enclosing_instantiation_of): Compare DECL_SOURCE_LOCATION if there is no enclosing non-lambda function. gcc/testsuite/ChangeLog: PR c++/95870 * g++.dg/cpp0x/lambda/lambda-nsdmi10.C: New test. --- gcc/cp/pt.c | 13 +++++++++++++ gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi10.C | 12 ++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi10.C base-commit: 7ebdef2076fda56cb4cffb941f6c2576f980f3b3 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 396e622c4db..d6a8ede386d 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -14371,6 +14371,19 @@ enclosing_instantiation_of (tree otctx) || instantiated_lambda_fn_p (tctx)); tctx = decl_function_context (tctx)) ++lambda_count; + + if (!tctx) + { + /* Match using DECL_SOURCE_LOCATION, which is unique for all lambdas. + + For GCC 11 the above condition limits this to the previously failing + case where all enclosing functions are lambdas (95870). FIXME. */ + for (tree ofn = fn; ofn; ofn = decl_function_context (ofn)) + if (DECL_SOURCE_LOCATION (ofn) == DECL_SOURCE_LOCATION (otctx)) + return ofn; + gcc_unreachable (); + } + for (; fn; fn = decl_function_context (fn)) { tree ofn = fn; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi10.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi10.C new file mode 100644 index 00000000000..810ed538719 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi10.C @@ -0,0 +1,12 @@ +// PR c++/95870 +// { dg-do compile { target c++11 } } + +template struct S { + S(); + int b = []() -> int { enum E {}; return 1; }(); +}; +struct C : S { + C(); +}; +template S::S() = default; +C::C() {}