public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r10-11305] c++: constant, array, lambda, template [PR108975]
@ 2023-04-21 20:28 Jason Merrill
  0 siblings, 0 replies; only message in thread
From: Jason Merrill @ 2023-04-21 20:28 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:92e2bb31ffe25271e5ae70d7533469419b883864

commit r10-11305-g92e2bb31ffe25271e5ae70d7533469419b883864
Author: Jason Merrill <jason@redhat.com>
Date:   Fri Mar 17 17:26:40 2023 -0400

    c++: constant, array, lambda, template [PR108975]
    
    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.c (prune_lambda_captures): Don't bother in a template.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp0x/lambda/lambda-const11.C: New test.

Diff:
---
 gcc/cp/lambda.c                                    |  3 +++
 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const11.C | 14 ++++++++++++++
 2 files changed, 17 insertions(+)

diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c
index ec87f3b163c..42b9d075f9e 100644
--- a/gcc/cp/lambda.c
+++ b/gcc/cp/lambda.c
@@ -1537,6 +1537,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<tree,tree*> 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<class T>
+void f() {
+  constexpr int dim = 1;
+  auto l = [&] {
+    int n[dim * 1];
+  };
+  // In f<int>, we shouldn't actually capture dim.
+  static_assert (sizeof(l) == 1, "");
+}
+
+template void f<int>();

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-04-21 20:28 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-21 20:28 [gcc r10-11305] c++: constant, array, lambda, template [PR108975] Jason Merrill

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).