1 // PR c++/61636
2 // { dg-do run { target c++14 } }
3 
4 // Check we don't capture this (too) unnecessarily
5 
6 struct A {
7   int b ();
fA8   void f (int) {}
fA9   static void f (double) {}
10 
gA11   static void g (int) {}
gA12   static void g (double) {}
13 };
14 
15 struct O {
xO16   void x (int) {}
xO17   static void x (double) {}
18 };
19 
20 namespace N {
y(double)21   void y (double) {}
22 }
23 
Check(bool expect,unsigned size)24 int Check (bool expect, unsigned size)
25 {
26   return (expect ? sizeof (void *) : 1) != size;
27 }
28 
b()29 int A::b() {
30   int r = 0;
31 
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)
37 
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);
43 
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);
48 
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);
54 
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);
63 
64   return r;
65 }
66 
main()67 int main ()
68 {
69   A a;
70 
71   return a.b () ? 1 : 0;
72 }
73