re PR c++/79180 (Nested lambda-capture causes segfault for parameter pack)
authorPaolo Carlini <paolo.carlini@oracle.com>
Mon, 2 Oct 2017 12:40:26 +0000 (12:40 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 2 Oct 2017 12:40:26 +0000 (12:40 +0000)
2017-10-02  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/79180
* g++.dg/cpp0x/lambda/lambda-nested8.C: New.
* g++.dg/torture/pr79180.C: Likewise.

PR c++/71386
* g++.dg/cpp1y/lambda-generic-nested1.C: New.

From-SVN: r253350

gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested8.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1y/lambda-generic-nested1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/torture/pr79180.C [new file with mode: 0644]

index 0214693..405a4b0 100644 (file)
@@ -1,3 +1,12 @@
+2017-10-02  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/79180
+       * g++.dg/cpp0x/lambda/lambda-nested8.C: New.
+       * g++.dg/torture/pr79180.C: Likewise.
+
+       PR c++/71386
+       * g++.dg/cpp1y/lambda-generic-nested1.C: New.
+
 2017-10-02  Richard Biener  <rguenther@suse.de>
 
        * gcc.dg/graphite/graphite.exp: Add -fdump-tree-graphite-details.
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested8.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested8.C
new file mode 100644 (file)
index 0000000..5a6f47c
--- /dev/null
@@ -0,0 +1,23 @@
+// PR c++/79180
+// { dg-do run { target c++11 } }
+
+void
+foo (int a)
+{
+  if (a != 127)
+    __builtin_abort ();
+}
+
+template <typename... Args>
+void
+bar (Args &&... args)
+{
+  [&]() { [&]() { foo (args...); } (); } ();
+}
+
+int
+main ()
+{
+  int x = 127;
+  bar (x);
+}
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-nested1.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-nested1.C
new file mode 100644 (file)
index 0000000..4cfd353
--- /dev/null
@@ -0,0 +1,34 @@
+// PR c++/71386
+// { dg-do run { target c++14 } }
+
+template<class...XS>
+auto List(XS...xs)
+{
+  return [=](auto processList){return processList(xs...);};
+}
+
+auto l1 = List(42);
+
+int test (int a)
+{
+  if (a != 42)
+    __builtin_abort ();
+  return 0;
+}
+
+auto foo = [](auto... xs1)
+  {
+    return [=]()
+    { 
+      return l1([=](auto)
+      {
+       return test (xs1...);
+      });
+    };
+  };
+
+int main()
+{
+  auto concat = l1(foo);
+  concat();
+}
diff --git a/gcc/testsuite/g++.dg/torture/pr79180.C b/gcc/testsuite/g++.dg/torture/pr79180.C
new file mode 100644 (file)
index 0000000..2e3992c
--- /dev/null
@@ -0,0 +1,23 @@
+// { dg-do run }
+// { dg-options "-Wall -std=c++11" }
+
+void
+foo (int a)
+{
+  if (a != 127)
+    __builtin_abort ();
+}
+
+template <typename... Args>
+void
+bar (Args &&... args)
+{
+  [&]() { [&]() { foo (args...); } (); } ();
+}
+
+int
+main ()
+{
+  int x = 127;
+  bar (x);
+}