blob: a1bd597295a2450adf90aab33782b0e286f7c090 [file] [log] [blame]
// PR c++/61636
// { dg-do run { target c++14 } }
// Check we don't capture this (too) unnecessarily
struct A {
int b ();
void f (int) {}
static void f (double) {}
static void g (int) {}
static void g (double) {}
};
struct O {
void x (int) {}
static void x (double) {}
};
namespace N {
void y (double) {}
}
int Check (bool expect, unsigned size)
{
return (expect ? sizeof (void *) : 1) != size;
}
int A::b() {
int r = 0;
// one of the functions is non-static
auto l0 = [&](auto z) { f (z); };
r += Check (true, sizeof l0);
l0(0.0); // doesn't need this capture for A::f(double), but too late
l0 (0); // Needs this capture for A::f(int)
// no fn is non-static.
auto l00 = [&](auto z) { g (z); };
r += Check (false, sizeof l00);
l00(0.0);
l00 (0);
// sizeof isn't an evaluation context, so no this capture
auto l1 = [&](auto z) { sizeof (f (z), 1); };
r += Check (false, sizeof l1);
l1(0.0); l1 (0);
auto l2 = [&](auto) { f (2.4); };
auto l3 = [&](auto) { f (0); };
l2(0); l3(0); l2(0.0); l3 (0.0);
r += Check (false, sizeof l2);
r += Check (true, sizeof l3);
auto l4 = [&](auto) { O::x (2.4); };
auto l5 = [&](auto) { N::y (2.4); };
auto l6 = [&](auto) { };
l4(0); l5(0); l6(0);
l4(0.0); l5(0.0); l6(0.0);
r += Check (false, sizeof l4);
r += Check (false, sizeof l5);
r += Check (false, sizeof l6);
return r;
}
int main ()
{
A a;
return a.b () ? 1 : 0;
}