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