PR c++/88761 - ICE with reference capture of constant.
authorJason Merrill <jason@redhat.com>
Sat, 2 Feb 2019 04:21:06 +0000 (23:21 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Sat, 2 Feb 2019 04:21:06 +0000 (23:21 -0500)
Here, we capture nf, then the use of the proxy decays to a constant during
semantic processing of +nf.  Since we saw some decay from proxy to constant,
we walk through the lambda body to see which proxies are still used, but we
weren't walking into subtrees of DECL_EXPR at all, so we missed the use of
&nf in the initializer of y, and removed the capture.  But then at
instantiation time we try to use nf, don't have a proxy anymore, and ICE.

* lambda.c (mark_const_cap_r): Do walk subtrees of DECL_EXPR for
non-proxy decls.

From-SVN: r268471

gcc/cp/ChangeLog
gcc/cp/lambda.c
gcc/testsuite/g++.dg/cpp1y/lambda-generic-const6.C [new file with mode: 0644]

index f0545aee116804286201f1189ae3352f54015a55..6c474fdda16c15059eaa3ae871a7e2fe996ce7cc 100644 (file)
@@ -1,3 +1,9 @@
+2019-02-01  Jason Merrill  <jason@redhat.com>
+
+       PR c++/88761 - ICE with reference capture of constant.
+       * lambda.c (mark_const_cap_r): Do walk subtrees of DECL_EXPR for
+       non-proxy decls.
+
 2019-02-01  Marek Polacek  <polacek@redhat.com>
 
        PR c++/88325 - ICE with invalid out-of-line template member definition.
index 4b7a358a0add3ba36528f9527ea3092be497d389..c31b06e2b1ef4b10165a096da1fb420da21f4726 100644 (file)
@@ -1488,8 +1488,10 @@ mark_const_cap_r (tree *t, int *walk_subtrees, void *data)
     {
       tree decl = DECL_EXPR_DECL (*t);
       if (is_constant_capture_proxy (decl))
-       var = DECL_CAPTURED_VARIABLE (decl);
-      *walk_subtrees = 0;
+       {
+         var = DECL_CAPTURED_VARIABLE (decl);
+         *walk_subtrees = 0;
+       }
     }
   else if (is_constant_capture_proxy (*t))
     var = DECL_CAPTURED_VARIABLE (*t);
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-const6.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-const6.C
new file mode 100644 (file)
index 0000000..e85d649
--- /dev/null
@@ -0,0 +1,18 @@
+// PR c++/88761
+// { dg-do compile { target c++14 } }
+
+template <class T>
+void f(T t) { t(1); }
+
+int main()
+{
+  const unsigned long nf = 10'000'000;
+
+  auto loop = [&](auto)
+  {
+    auto x = +nf;
+    auto y = &nf;
+  };
+
+  f(loop);
+}