Viewing file: pr61636-2.C (1.42 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// 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; }
|