* c-c++-common/array-init.c: Add dg-prune-output. * g++.dg/cpp0x/lambda/lambda-const-this.C: Add dg-warning. * g++.dg/cpp0x/lambda/lambda-in-class-neg.C: Likewise. * g++.dg/cpp0x/lambda/lambda-in-class.C: Likewise. * g++.dg/cpp0x/lambda/lambda-nested.C: Likewise. * g++.dg/cpp0x/lambda/lambda-nsdmi1.C: Likewise. * g++.dg/cpp0x/lambda/lambda-nsdmi4.C: Likewise. * g++.dg/cpp0x/lambda/lambda-this.C: Likewise. * g++.dg/cpp0x/lambda/lambda-this17.C: Likewise. * g++.dg/cpp0x/lambda/lambda-this18.C: Likewise. * g++.dg/cpp0x/lambda/lambda-this2.C: Likewise. * g++.dg/cpp0x/lambda/lambda-this8.C: Likewise. * g++.dg/cpp1y/pr64382.C: Likewise. * g++.dg/cpp1y/pr77739.C: Likewise. * g++.dg/cpp1z/lambda-this1.C: Likewise. * g++.dg/cpp1z/lambda-this2.C: Likewise. * g++.dg/template/crash84.C: Adjust dg-error. From-SVN: r264169
87 lines
5.1 KiB
C
87 lines
5.1 KiB
C
// P0018R3 - C++17 lambda capture of *this
|
|
// { dg-do compile { target c++11 } }
|
|
|
|
struct A {
|
|
int a;
|
|
void foo () {
|
|
int v = 4;
|
|
auto b = [*this, this] {}; // { dg-error "already captured 'this'" }
|
|
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
|
auto c = [this, *this] {}; // { dg-error "already captured 'this'" }
|
|
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
|
auto d = [this] { return a; };
|
|
auto e = [*this] { return a; }; // { dg-error "'*this' capture only available with" "" { target c++14_down } }
|
|
auto f = [this] { a++; };
|
|
auto g = [*this] { a++; }; // { dg-error "in read-only object" }
|
|
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
|
auto h = [*this] () mutable { a++; };// { dg-error "'*this' capture only available with" "" { target c++14_down } }
|
|
auto i = [=] { return a; }; // { dg-warning "implicit capture" "" { target c++2a } }
|
|
auto j = [&] { return a; };
|
|
// P0409R2 - C++2A lambda capture [=, this]
|
|
auto k = [=, this] { return a; };// { dg-error "explicit by-copy capture of 'this' redundant with by-copy capture default" "" { target c++17_down } }
|
|
auto l = [&, this] { return a; };
|
|
auto m = [=, *this] { return a; };// { dg-error "'*this' capture only available with" "" { target c++14_down } }
|
|
auto n = [&, *this] { return a; };// { dg-error "'*this' capture only available with" "" { target c++14_down } }
|
|
auto o = [*this, &v] { return a + v; };// { dg-error "'*this' capture only available with" "" { target c++14_down } }
|
|
auto p = [*this] { this = 0; }; // { dg-error "lvalue required as left operand of assignment" }
|
|
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
|
auto q = [=, this, *this] { return a; };// { dg-error "already captured 'this'" }
|
|
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
|
// { dg-error "explicit by-copy capture of 'this' redundant with by-copy capture default" "" { target c++17_down } .-2 }
|
|
auto r = [=, this, this] { return a; };// { dg-error "already captured 'this'" }
|
|
// { dg-error "explicit by-copy capture of 'this' redundant with by-copy capture default" "" { target c++17_down } .-1 }
|
|
auto s = [=, *this, this] { return a; };// { dg-error "already captured 'this'" }
|
|
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
|
// { dg-error "explicit by-copy capture of 'this' redundant with by-copy capture default" "" { target c++17_down } .-2 }
|
|
auto t = [=, *this, *this] { return a; };// { dg-error "already captured 'this'" }
|
|
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
|
auto u = [&, this, *this] { return a; };// { dg-error "already captured 'this'" }
|
|
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
|
auto w = [&, this, this] { return a; };// { dg-error "already captured 'this'" }
|
|
auto x = [&, *this, this] { return a; };// { dg-error "already captured 'this'" }
|
|
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
|
auto y = [&, *this, *this] { return a; };// { dg-error "already captured 'this'" }
|
|
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
|
}
|
|
};
|
|
struct B {
|
|
double b;
|
|
B () : b (.007) {}
|
|
double foo () {
|
|
return [this]{ return [*this] { return b; }; }()(); // { dg-error "'*this' capture only available with" "" { target c++14_down } }
|
|
}
|
|
void bar () {
|
|
auto c = []{ return [*this] { return b; }; }; // { dg-error "'this' was not captured for this lambda function" }
|
|
} // { dg-error "invalid use of non-static data member 'B::b'" "" { target *-*-* } .-1 }
|
|
}; // { dg-error "'*this' capture only available with" "" { target c++14_down } .-2 }
|
|
struct C {
|
|
int c;
|
|
C (const C &) = delete;
|
|
void bar () const;
|
|
void foo () {
|
|
auto d = [this] { return c; };
|
|
auto e = [*this] { return c; }; // { dg-error "use of deleted function" }
|
|
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
|
auto f = [=] { return c; }; // { dg-warning "implicit capture" "" { target c++2a } }
|
|
auto g = [&] { return c; };
|
|
auto h = [this] { bar (); };
|
|
auto i = [*this] { bar (); }; // { dg-error "use of deleted function" }
|
|
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
|
}
|
|
};
|
|
struct D {
|
|
int d;
|
|
~D () = delete;
|
|
void bar () const;
|
|
void foo () {
|
|
auto e = [this] { return d; };
|
|
auto f = [*this] { return d; }; // { dg-error "use of deleted function" }
|
|
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
|
auto g = [=] { return d; }; // { dg-warning "implicit capture" "" { target c++2a } }
|
|
auto h = [&] { return d; };
|
|
auto i = [this] { bar (); };
|
|
auto j = [*this] { bar (); }; // { dg-error "use of deleted function" }
|
|
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
|
}
|
|
};
|