/cp
[official-gcc.git] / gcc / testsuite / g++.dg / cpp1y / pr61636-2.C
bloba1bd597295a2450adf90aab33782b0e286f7c090
1 // PR c++/61636
2 // { dg-do run { target c++14 } }
4 // Check we don't capture this (too) unnecessarily
6 struct A {
7   int b ();
8   void f (int) {}
9   static void f (double) {}
11   static void g (int) {}
12   static void g (double) {}
15 struct O {
16   void x (int) {}
17   static void x (double) {}
20 namespace N {
21   void y (double) {}
24 int Check (bool expect, unsigned size)
26   return (expect ? sizeof (void *) : 1) != size;
29 int A::b() {
30   int r = 0;
32   // one of the functions is non-static
33   auto l0 = [&](auto z) { f (z); };
34   r += Check (true, sizeof l0);
35   l0(0.0); // doesn't need this capture for A::f(double), but too late
36   l0 (0); // Needs this capture for A::f(int)
38   // no fn is non-static.
39   auto l00 = [&](auto z) { g (z); };
40   r += Check (false, sizeof l00);
41   l00(0.0); 
42   l00 (0);
44   // sizeof isn't an evaluation context, so no this capture
45   auto l1 = [&](auto z) { sizeof (f (z), 1); };
46   r += Check (false, sizeof l1);
47   l1(0.0); l1 (0); 
49   auto l2 = [&](auto) { f (2.4); };
50   auto l3 = [&](auto) { f (0); };
51   l2(0); l3(0); l2(0.0); l3 (0.0);
52   r += Check (false, sizeof l2);
53   r += Check (true, sizeof l3);
55   auto l4 = [&](auto) { O::x (2.4); };
56   auto l5 = [&](auto) { N::y (2.4); };
57   auto l6 = [&](auto) { };
58   l4(0); l5(0); l6(0);
59   l4(0.0); l5(0.0); l6(0.0);
60   r += Check (false, sizeof l4);
61   r += Check (false, sizeof l5);
62   r += Check (false, sizeof l6);
64   return r;
67 int main ()
69   A a;
71   return a.b () ? 1 : 0;