From patchwork Fri Mar 17 23:32:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 1758436 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.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+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: legolas.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=deJBQc4k; dkim-atps=neutral Received: from sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4PdgRm00dFz247T for ; Sat, 18 Mar 2023 10:33:22 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 065163850213 for ; Fri, 17 Mar 2023 23:33:19 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 065163850213 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1679095999; bh=34BGBRLzjV1pesQw+XkwYZsZFV4maHjkowZmx1LnG0s=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=deJBQc4kPAaR+G3H7gGn4o6UF9vNrIBQGYQVxGPAVo/uLGyhbSb1MWZRQIBusHqH1 7qsEliMbDhJqTgtjiaXDZ2Hevicy+UgjFoWhdc2J6Qet+ZUAsVHxDAluOX6MtvPsLO eR5SCyaFKehIn6gi+gtOkVUpSmEWiMj8j2xyzWwE= 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 D75C13858C50 for ; Fri, 17 Mar 2023 23:32:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D75C13858C50 Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-459-jIw93vA0PHGmKGJF19jI7w-1; Fri, 17 Mar 2023 19:32:54 -0400 X-MC-Unique: jIw93vA0PHGmKGJF19jI7w-1 Received: by mail-qv1-f71.google.com with SMTP id e1-20020a0cd641000000b005b47df84f6eso3607946qvj.0 for ; Fri, 17 Mar 2023 16:32:54 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679095973; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=34BGBRLzjV1pesQw+XkwYZsZFV4maHjkowZmx1LnG0s=; b=J5Qo5alAgl6Ihe2RQS3ylIqqKfQk1NrUm0aigC1c8gZVMguMhD4ZmsK9D1WVkrgckO 7k8+NFVcuiVbpLIp+ooJjoWcCmltDky+tEIzcZy/FXxiSZAbi9DUmJewxYZWXQ8Flall 08bYHN3nu49Dth/revR8Xt+Cc/9iYiUIEZGciKWN+ntbqEsG/RzBeVp3Lp2qU9RSvUZ6 KooETEij7hcm5pSRl+t8jHKI+ZhzO3GqQhU378cdHY3nVM0dcG1YEjWTiB6SyKiEWiuw DFUtZFt3vOtIQycDaTImQx7+um+YmUxs+rDwpjF/LpfFWpWJLajZxoZMmhX6DGtEZQVs bilQ== X-Gm-Message-State: AO0yUKVAuhWs9ttcp3lbEwBJzl1izuteqHX5/E/qNLdB2GoPLPdl4ahy DczNw5+nyAkOMyWgZKFGF8D/NgELNGPinNxD3uWsirMhIvAwrAFTztyg6K+UwlF3/peMH1djgG5 plBY4oFjzicvZX/JIIFwIYkbJFxhTwxDfBmx6VI2B/uWikP8usOGHVtuAbT1fpfZycrX1kM/Jwg == X-Received: by 2002:a05:6214:2388:b0:56e:9551:1966 with SMTP id fw8-20020a056214238800b0056e95511966mr42195052qvb.3.1679095973130; Fri, 17 Mar 2023 16:32:53 -0700 (PDT) X-Google-Smtp-Source: AK7set/aRApikRaJ7rkskIDxqic/oc76ysmhZZTciFoAA+TWjRxZxaEPCRQljqcyAz2pj4WPoVrJcQ== X-Received: by 2002:a05:6214:2388:b0:56e:9551:1966 with SMTP id fw8-20020a056214238800b0056e95511966mr42195034qvb.3.1679095972759; Fri, 17 Mar 2023 16:32:52 -0700 (PDT) Received: from jason.cygnus.com (130-44-159-43.s15913.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.159.43]) by smtp.gmail.com with ESMTPSA id z72-20020a37654b000000b0074283b87a4esm2574439qkb.90.2023.03.17.16.32.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Mar 2023 16:32:52 -0700 (PDT) To: gcc-patches@gcc.gnu.org Subject: [pushed] c++: constant, array, lambda, template [PR108975] Date: Fri, 17 Mar 2023 19:32:49 -0400 Message-Id: <20230317233249.1406928-1-jason@redhat.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-12.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_H2, 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.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+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" Tested x86_64-pc-linux-gnu, applying to trunk. -- 8< -- When a lambda refers to a constant local variable in the enclosing scope, we tentatively capture it, but if we end up pulling out its constant value, we go back at the end of the lambda and prune any unneeded captures. Here while parsing the template we decided that the dim capture was unneeded, because we folded it away, but then we brought back the use in the template trees that try to preserve the source representation with added type info. So then when we tried to instantiate that use, we couldn't find what it was trying to use, and crashed. Fixed by not trying to prune when parsing a template; we'll prune at instantiation time. PR c++/108975 gcc/cp/ChangeLog: * lambda.cc (prune_lambda_captures): Don't bother in a template. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/lambda/lambda-const11.C: New test. --- gcc/cp/lambda.cc | 3 +++ gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const11.C | 14 ++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const11.C base-commit: 890043314a7f405081990ea9d0cb577dd44f883f diff --git a/gcc/cp/lambda.cc b/gcc/cp/lambda.cc index 212990a21bf..9925209b2ed 100644 --- a/gcc/cp/lambda.cc +++ b/gcc/cp/lambda.cc @@ -1760,6 +1760,9 @@ prune_lambda_captures (tree body) if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lam) == CPLD_NONE) /* No default captures, and we don't prune explicit captures. */ return; + /* Don't bother pruning in a template, we'll prune at instantiation time. */ + if (dependent_type_p (TREE_TYPE (lam))) + return; hash_map const_vars; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const11.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const11.C new file mode 100644 index 00000000000..26af75bf132 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const11.C @@ -0,0 +1,14 @@ +// PR c++/108975 +// { dg-do compile { target c++11 } } + +template +void f() { + constexpr int dim = 1; + auto l = [&] { + int n[dim * 1]; + }; + // In f, we shouldn't actually capture dim. + static_assert (sizeof(l) == 1, ""); +} + +template void f();