diff options
author | Ben Cheng <bccheng@google.com> | 2014-03-25 22:37:19 -0700 |
---|---|---|
committer | Ben Cheng <bccheng@google.com> | 2014-03-25 22:37:19 -0700 |
commit | 1bc5aee63eb72b341f506ad058502cd0361f0d10 (patch) | |
tree | c607e8252f3405424ff15bc2d00aa38dadbb2518 /gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda | |
parent | 283a0bf58fcf333c58a2a92c3ebbc41fb9eb1fdb (diff) | |
download | toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.gz toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.bz2 toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.zip |
Initial checkin of GCC 4.9.0 from trunk (r208799).
Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba
Diffstat (limited to 'gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda')
146 files changed, 2677 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-50220.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-50220.C new file mode 100644 index 000000000..4da9d4691 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-50220.C @@ -0,0 +1,9 @@ +// PR c++/50220 +// { dg-do compile { target c++11 } } + +template<typename Foo> struct Foobar {}; + +void foobar(const Foobar<void>& obj) +{ + [obj](){}(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-98.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-98.C new file mode 100644 index 000000000..ff1085f30 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-98.C @@ -0,0 +1,8 @@ +// PR c++/46159 +// { dg-options -std=c++98 } + +void +f() +{ + int **p = new(int(*[2])); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__.C new file mode 100644 index 000000000..52bb874c5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__.C @@ -0,0 +1,8 @@ +// PR c++/44160 +// { dg-do link { target c++11 } } + +int main() +{ + const char *p = []() { return __func__; }(); + return p == 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-anon1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-anon1.C new file mode 100644 index 000000000..482193e97 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-anon1.C @@ -0,0 +1,18 @@ +// DR 1612 +// { dg-require-effective-target c++11 } + +int main() { + static int result; + struct A { int x; }; + struct B { int y; }; + union { + A a; B b; + }; + a.x = 1; + [=]() mutable { + a.x = 2; // { dg-error "anonymous union" } + result = b.y; // { dg-error "anonymous union" } + }(); + if (result == 1) return 0; + throw 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-array.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-array.C new file mode 100644 index 000000000..adb40ed6b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-array.C @@ -0,0 +1,19 @@ +// Test that array capture by copy works. +// { dg-do run { target c++11 } } + +struct A +{ + int i; + A(int i): i(i) {} + A(const A& a): i(a.i+1) {} +}; + +int main() +{ + A ar[4][3] = { { 10, 20, 30 }, + { 40, 50, 60 }, + { 70, 80, 90 }, + { 100, 110, 120 } }; + int i = [ar] { return ar[1][1]; }().i; + return (i!= 52); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto1.C new file mode 100644 index 000000000..d13e2c0da --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto1.C @@ -0,0 +1,14 @@ +// PR c++/50437 +// { dg-do compile { target c++11 } } + +template <typename T> +void f() +{ + auto g = [](T t){ return t == 0; }; + g(T()); +} + +int main() +{ + f<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C new file mode 100644 index 000000000..05fadf5d0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C @@ -0,0 +1,16 @@ +// PR c++/56901 +// { dg-require-effective-target c++11 } + +template <typename> +void foo_impl() +{ + int data; + auto L = [&](){ return data; }; + [&](){ L(); }(); + [&L](){ L(); }(); +} + +void foo() +{ + foo_impl<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C new file mode 100644 index 000000000..013ed5264 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C @@ -0,0 +1,24 @@ +// PR c++/57526 +// { dg-require-effective-target c++11 } + +template<class T> +struct A +{ + void bar( ) { } + + void foo( ) + { + auto* this_ptr = this; + auto lc = [&]( ) + { + this_ptr->bar(); + }; + lc(); + } +}; + +int main() +{ + A<int> a; + a.foo(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref-neg.C new file mode 100644 index 000000000..9c9632cd5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref-neg.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } +#include <cassert> + +int main() { + int i = 1, j = 2; + const int& ci = i; + [&ci, &j] () -> void { j = ci; } (); + assert(i == 1); + assert(j == 1); + [&ci] () -> void { ci = 0; } (); // { dg-error "" "cannot assign to const int&" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref.C new file mode 100644 index 000000000..16fd0a713 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref.C @@ -0,0 +1,14 @@ +// { dg-do run { target c++11 } } +#include <cassert> + +int main() { + int i = 1, j = 2; + const int& ci = i; + [&ci, &j] () -> void { j = ci; } (); + assert(i == 1); + assert(j == 1); + //[&ci] () -> void { ci = 0; } (); { dg-error: cannot assign to const int& } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C new file mode 100644 index 000000000..3f9da7e46 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C @@ -0,0 +1,15 @@ +// PR c++/50736 +// { dg-do compile { target c++11 } } + +int i; +void f(); +typedef int T; + +int main() +{ + [i]{}; // { dg-error "non-automatic" } + [f]{}; // { dg-error "non-variable" } + [T]{}; // { dg-error "non-variable" } +} + +struct A { }; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-redundancy.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-redundancy.C new file mode 100644 index 000000000..49fbdf320 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-redundancy.C @@ -0,0 +1,13 @@ +// FDIS 5.1.2/8 +// { dg-do compile { target c++11 } } +// { dg-options "-pedantic-errors" } + +struct S2 { void f(int i); }; +void S2::f(int i) { + [&, i]{ }; // OK + [&, &i]{ }; // { dg-error "" } i preceded by & when & is the default + [=, i]{ }; // { dg-error "" } i not preceded by & when = is the default + [=, this]{ }; // { dg-error "" } this when = is the default + [i, i]{ }; // { dg-error "" } i repeated + [this, this]{ }; // { dg-error "" } i repeated +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C new file mode 100644 index 000000000..28ea53363 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } + +#include <cassert> + +template<typename F> +void call(const F& f) { f(); } + +int main() { + call([] () -> void {}); + call([] () mutable -> void {}); + + int i = -1; + call([&i] () -> void { i = 0; }); + assert(i == 0); + call([i] () -> void { i = 0; }); // { dg-error "" "assignment to non-reference capture in const lambda" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const.C new file mode 100644 index 000000000..c6150f174 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const.C @@ -0,0 +1,19 @@ +// { dg-do run { target c++11 } } + +#include <cassert> + +template<typename F> +void call(const F& f) { f(); } + +int main() { + call([] () -> void {}); + //call([] () mutable -> void {}); // { dg-error: "`f' does not have const `operator()'" } + + int i = -1; + call([&i] () -> void { i = 0; }); + assert(i == 0); + //call([i] () -> void { i = 0; }); // { dg-error: "assignment to non-reference capture in const lambda" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const2.C new file mode 100644 index 000000000..884163a29 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const2.C @@ -0,0 +1,15 @@ +// PR c++/52026 +// { dg-options "-O" } +// { dg-do run { target c++11 } } + +template<bool B> +int func() { + const int constVal1 = B ? 100 : -100; + const int constVal = constVal1; + return [] { return constVal; }(); +} + +int main() { + if (func<true>() != 100) + __builtin_abort (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C new file mode 100644 index 000000000..08d8bbfc2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C @@ -0,0 +1,14 @@ +// Test for conversion from stateless lambda to function pointer. + +// { dg-do compile { target c++11 } } +// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZZ1fvENKUlvE_cvPFvvEEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin *-*-hpux10* } } } } } + +inline void f() +{ + void (*pfn)() = []{}; +} + +int main() +{ + f(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv2.C new file mode 100644 index 000000000..cd4cf7e61 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv2.C @@ -0,0 +1,11 @@ +// Test for conversion from stateless lambda to function pointer. + +// { dg-do run { target c++11 } } + +typedef int (*pfn)(int); + +int main() +{ + pfn p = [](int i) { return i-42; }; + return p (42); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv3.C new file mode 100644 index 000000000..ebc6c14d2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv3.C @@ -0,0 +1,12 @@ +// Conversion to a function pointer uses a generic thunk, which doesn't +// work properly for variadics. Make sure that we can still use the lambda +// normally. + +// { dg-do compile { target c++11 } } + +void f() +{ + auto l = [](...){}; + void (*p1)(...) = l; // { dg-bogus "sorry" "" { xfail *-*-* } } + l(); // OK +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C new file mode 100644 index 000000000..66c09102d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C @@ -0,0 +1,13 @@ +// PR c++/43641 +// { dg-do compile { target c++11 } } + +struct B +{ + int i; +}; + +void func() +{ + [](const B& b) -> const int& { return b.i; }; + [](const B& b) { return b; }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv5.C new file mode 100644 index 000000000..f5408a962 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv5.C @@ -0,0 +1,15 @@ +// PR c++/45080 +// { dg-do compile { target c++11 } } + +typedef void(*pfn)(); + +template<typename=int> +void f() +{ + pfn fn = []{}; +} + +void test() +{ + f(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C new file mode 100644 index 000000000..3b3fda9f9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C @@ -0,0 +1,6 @@ +// PR c++/55015 +// { dg-do link { target c++11 } } + +typedef void (*VoidFunc)(); +inline VoidFunc GetFunc() { return [](){}; } +int main() { VoidFunc func = GetFunc(); } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv7.C new file mode 100644 index 000000000..89e4e4bab --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv7.C @@ -0,0 +1,20 @@ +// PR c++/55710 +// { dg-do link { target c++11 } } + +template <class T> +struct X { + static void (*code) (); +}; + +template <class T> +void (*X<T>::code) () = []{}; // Line 7 + +struct Y { + void (*code) () = []{} ; // Line 10 + void operator()() { code(); } +}; + +int main () { + X<int>::code(); + Y()(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv8.C new file mode 100644 index 000000000..abe272a8b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv8.C @@ -0,0 +1,15 @@ +// PR c++/56447 +// { dg-do compile { target c++11 } } + +template <class T> +void f() +{ + int i; + // This lambda should not have a conversion op, since it captures i + int (*p)() = [=]{ return i; }; // { dg-error "cannot convert" } +} + +int main() +{ + f<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default-neg.C new file mode 100644 index 000000000..91f5d621b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default-neg.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } + +int main() { + int i; + const char* s; + [=] () -> void { i; s; i; s; } (); + + [] () -> void { i; } (); // { dg-error "" "`i' is not captured" } + [1] () -> void {} (); // { dg-error "expected identifier" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default.C new file mode 100644 index 000000000..232c56b46 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default.C @@ -0,0 +1,13 @@ +// { dg-do run { target c++11 } } + +int main() { + int i; + const char* s; + [=] () -> void { i; s; i; s; } (); + + //[] () -> void { i; } (); // { dg-error: "`i' is not in scope" } + //[1] () -> void {} (); // { dg-error: "expected identifier" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-neg.C new file mode 100644 index 000000000..caffb7f25 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-neg.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } + +int main() { + int i; + const char* s; + [i, s] () -> void { i; s; } (); + + [] () -> void { i; } (); // { dg-error "" "`i' is not captured" } + [1] () -> void {} (); // { dg-error "expected identifier" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy.C new file mode 100644 index 000000000..6d27d75fe --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy.C @@ -0,0 +1,13 @@ +// { dg-do run { target c++11 } } + +int main() { + int i; + const char* s; + [i, s] () -> void { i; s; } (); + + //[] () -> void { i; } (); // { dg-error: "`i' is not in scope" } + //[1] () -> void {} (); // { dg-error: "expected identifier" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctor-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctor-neg.C new file mode 100644 index 000000000..4a63d000f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctor-neg.C @@ -0,0 +1,25 @@ +// { dg-do compile { target c++11 } } + +void f() +{ + int i; + auto lam = [i]{}; // { dg-message "" } + decltype(lam) lam2 = { 1 }; // { dg-error "" "not an aggregate" } + decltype(lam) lam3; // { dg-error "" "deleted default ctor" } + lam3 = lam; // { dg-error "" "deleted assignment op" } +} + +template <class T> +void g(T i) +{ + auto lam = [i]{}; // { dg-message "" } + decltype(lam) lam2 = { 1 }; // { dg-error "" "not an aggregate" } + decltype(lam) lam3; // { dg-error "" "deleted default ctor" } + lam3 = lam; // { dg-error "" "deleted assignment op" } +} + +int main() +{ + f(); + g(1); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctors.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctors.C new file mode 100644 index 000000000..8dfb2fa6b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctors.C @@ -0,0 +1,17 @@ +// { dg-do run { target c++11 } } + +struct A +{ + A() { } + A(A&) { } + A(A&&) { } +}; + +int main() +{ + A a; + auto lam4 = [a]{}; // OK, implicit move ctor + lam4(); + auto lam5 = lam4; // OK, implicit copy ctor + lam5(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-debug.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-debug.C new file mode 100644 index 000000000..b8b15d01a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-debug.C @@ -0,0 +1,16 @@ +// PR c++/43502 +// { dg-do compile { target c++11 } } +// { dg-options "-fcompare-debug" } + +void g (int n) +{ + int bef ([]{return 0;}()); +} +struct S { + void f (int = []{return 0;}(), int = [] { return 0;}()); +}; +int main () +{ + S ().f (); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-decltype1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-decltype1.C new file mode 100644 index 000000000..b36ca2167 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-decltype1.C @@ -0,0 +1,22 @@ +// PR c++/59791 +// We force the gimple dump to trigger use of lang_decl_name. +// { dg-do compile { target c++11 } } +// { dg-options "-fdump-tree-gimple" } +// { dg-final { cleanup-tree-dump "gimple" } } + +template < class T > void +f (T t) +{ + int i = t; + [](int)->decltype (i + t) + { + return 0; + } + (0); +} + +void +foo () +{ + f (0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C new file mode 100644 index 000000000..88970a933 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C @@ -0,0 +1,22 @@ +// Testcase for DR 975. + +// { dg-do compile { target c++11 } } + +bool b; +struct A { int fn1(); const int& fn2(); }; +struct B { int fn1(); long fn2(); }; + +template <class T> int f (T t) { + return [](T t){ + if (b) + return t.fn1(); + else + return t.fn2(); // { dg-error "inconsistent types" } + }(t); +} + +int main() +{ + f(A()); // { dg-bogus "" } int and const int& are compatible + f(B()); // { dg-message "from here" } int and long are not +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg2.C new file mode 100644 index 000000000..fdbb4e1e3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg2.C @@ -0,0 +1,22 @@ +// Test that this is accepted even when pedantic now that it's part +// of the standard. + +// { dg-do compile { target c++11 } } +// { dg-options "-pedantic" } + +bool b; +template <class T> +T f (T t) +{ + [=] { return t+1; }; // OK + return [=] { + auto i = t+1; + return i+1; + }(); +} + +int main() +{ + if (f(1) != 3) + return 1; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-neg.C new file mode 100644 index 000000000..6ada75756 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-neg.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +int main() { + int i = 0; + int& r = [&] () { return i; } (); // { dg-error "" "invalid initialization of non-const reference of type .int&. from a temporary of type .int." } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce.C new file mode 100644 index 000000000..b0e2d9fba --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce.C @@ -0,0 +1,28 @@ +// { dg-do run { target c++11 } } +#include <cassert> + +int main() { + [] {}; + [] {} (); + [] () {}; + [] () {} (); + [] () { return "lambda"; }; + + int i = 1, j = 2; + [&i, j] () { i = j; } (); + assert(i == 2); + assert(j == 2); + + i = [] () { return 3; } (); + assert(i == 3); + + int k = [&] () { return i; } (); + + []{ return; }; + + int array[] = { 1, 2, 3 }; + int* p = [&] () { return array; } (); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C new file mode 100644 index 000000000..5cf016cb9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C @@ -0,0 +1,11 @@ +// PR c++/43875 +// { dg-do compile { target c++11 } } + +void f(); +void f(int); + +int main() +{ + auto x1 = []{ return f; }; // { dg-error "return|overloaded" } + auto x2 = []{ return { 1, 2 }; }; // { dg-error "return|list" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg.C new file mode 100644 index 000000000..cefa24d43 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg.C @@ -0,0 +1,6 @@ +// { dg-do compile { target c++11 } } + +int main() +{ + [](int a = 1) { return a; }(); // { dg-error "" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg2.C new file mode 100644 index 000000000..35104c392 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg2.C @@ -0,0 +1,7 @@ +// PR c++/43886 +// { dg-do compile { target c++11 } } + +void f2() { + int i = 1; + void g5(int = ([]{ return sizeof i; })()); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg3.C new file mode 100644 index 000000000..1c5939301 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg3.C @@ -0,0 +1,19 @@ +// PR c++/55223 +// { dg-do compile { target c++11 } } +// { dg-options "-fabi-version=0" } +// { dg-final { scan-assembler "_ZN8functionC1IZN1CIiE4testES_Ed_UliE_EET_" } } + +struct function +{ + template <class U> function(U u) { } +}; + +template<typename T> struct C +{ + static T test(function f = [](int i){return i;}) { } +}; + +int main() +{ + C<int>::test(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg4.C new file mode 100644 index 000000000..221795459 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg4.C @@ -0,0 +1,8 @@ +// PR c++/54764 +// { dg-require-effective-target c++11 } + +template<class T = void> +struct c +{ + int (*f)(int) = [](int i){return i + i;}; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg5.C new file mode 100644 index 000000000..d85918dd0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg5.C @@ -0,0 +1,30 @@ +// PR c++/58083 +// { dg-do compile { target c++11 } } + +namespace details { +struct iterator_concept_checker +{ + typedef char yes_type; + typedef char (&no_type)[2]; + + template <typename T> + static no_type test(...); + + template <typename T> + static yes_type test( + int* + , void (*)(T) = [](T it) + { + auto copy = T{it}; // copy constructible + copy = it; // copy assignable + copy.~T(); // destroyable + ++it; // incrementable + } + ); +}; +} + +int main() +{ + details::iterator_concept_checker::test<int>(0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-diag1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-diag1.C new file mode 100644 index 000000000..dc1043b3f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-diag1.C @@ -0,0 +1,8 @@ +// { dg-require-effective-target c++11 } + +int main() +{ + int x; + auto f = [x]{ }; + f.__x.foo; // { dg-error "<lambda\\(\\)>::<x capture>" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-direct-init.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-direct-init.C new file mode 100644 index 000000000..7cc3f8f67 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-direct-init.C @@ -0,0 +1,14 @@ +// Test that capture by copy uses direct-initialization. +// { dg-do compile { target c++11 } } + +struct A +{ + A(); + explicit A(const A&); +}; + +int main() +{ + A a; + [a]{}; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh.C new file mode 100644 index 000000000..7516fe0fe --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh.C @@ -0,0 +1,35 @@ +// Test that we properly clean up if we get an exception in the middle of +// constructing the closure object. + +// This test fails because of PR 41449; it isn't a lambda issue. +// { dg-do run { xfail *-*-* } } +// { dg-require-effective-target c++11 } + +struct A +{ + A() {} + A(const A&) { throw 1; } +}; + +int bs; +struct B +{ + B() { ++bs; } + B(const B&) { ++bs; } + ~B() { --bs; } +}; + +int main() +{ + { + B b1, b2; + A a; + + try + { + [b1, a, b2]{ }; + } + catch(...) {} + } + return bs; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C new file mode 100644 index 000000000..1ef510a48 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C @@ -0,0 +1,17 @@ +// PR c++/47263 +// PR c++/49260 +// { dg-options "-fno-asynchronous-unwind-tables -fno-dwarf2-cfi-asm" } +// { dg-do run { target c++11 } } + +#include <exception> + +int main( void ) +{ + std::set_unexpected( []{ throw 0; } ); + try + { + []() throw( int ) { throw nullptr; }(); + } + catch( int ) + { } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh3.C new file mode 100644 index 000000000..10dc6e36d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh3.C @@ -0,0 +1,14 @@ +// PR c++/56388 +// { dg-require-effective-target c++11 } + +int main() +{ + bool /*const*/ condition = false; + + [&]{ + try{} + catch(...){ + if(condition){} + } + }(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err1.C new file mode 100644 index 000000000..932ff1bee --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err1.C @@ -0,0 +1,8 @@ +// PR c++/51415 +// { dg-do compile { target c++11 } } + +void foo() +{ + int x[1]; + [x]{} = 0; // { dg-error "lambda" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err2.C new file mode 100644 index 000000000..aaa80f470 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err2.C @@ -0,0 +1,12 @@ +// PR c++/53158 +// { dg-do compile { target c++11 } } + +int main() +{ + auto a = []() { return true; }; + auto b = []() { return a(); }; // { dg-error "'a' is not captured" } + int c, d; + while (b() && c < d) // { dg-error "could not convert" } + { + } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err3.C new file mode 100644 index 000000000..fec01acb6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err3.C @@ -0,0 +1,10 @@ +// PR c++/51412 +// { dg-do compile { target c++11 } } + +void foo(int); + +template<int> void bar() +{ + foo([]{}...); // { dg-error "<lambda>" } + foo([]{}=0 ...); // { dg-error "<lambda>" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C new file mode 100644 index 000000000..3dc7f8774 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C @@ -0,0 +1,18 @@ +// Test that error messages about creating the closure object refer to +// the lambda-introducer. +// { dg-do compile { target c++11 } } + +struct A +{ + A(); + A(const A& a) = delete; // { dg-message "declared" } +}; + +int main() +{ + A ar[4][3]; + [ar] { }; // { dg-error "3:" } + + A a; + [a] { }; // { dg-error "3:" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C new file mode 100644 index 000000000..4ddd38cc4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C @@ -0,0 +1,19 @@ +// PR c++/42399 +// { dg-do compile { target c++11 } } + +struct A { + A(); + A(const A&) = delete; // { dg-message "declared" } +}; + +template <class T> +void f() +{ + T t; + [t] { return 0; }; // { dg-error "use" } +} + +int main() +{ + f<A>(); // { dg-message "required" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-field-names.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-field-names.C new file mode 100644 index 000000000..1c5cfdbd8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-field-names.C @@ -0,0 +1,21 @@ +// "For each entity captured by copy, an unnamed non-static data member is +// declared in the closure type" -- test that there isn't a member of the +// closure with the same name as the captured variable. + +// { dg-do compile { target c++11 } } + +template <class T> +struct A: public T +{ + A(T t): T(t) { } + int f() { return this->i; } // { dg-error "" "no member named i" } +}; + +int main() +{ + int i = 42; + auto lam = [i]{ }; + lam.i = 24; // { dg-error "" "no member named i" } + A<decltype(lam)> a(lam); + return a.f(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-for.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-for.C new file mode 100644 index 000000000..0123034e0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-for.C @@ -0,0 +1,13 @@ +// PR c++/50114 +// { dg-do compile { target c++11 } } +// { dg-options "-w" } + +int open() +{ + int *x2feed_i = 0; + auto insert_feed = [&](unsigned char venue, int* newfeed) + { + for(int x2feed_i = 1; 0; ) ; + x2feed_i = newfeed; + }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice1.C new file mode 100644 index 000000000..e4a11eaf6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice1.C @@ -0,0 +1,13 @@ +// PR c++/43790 +// { dg-do compile { target c++11 } } + +struct A +{ + int f(); +}; + +int main() +{ + A a; + auto l = [] () { return a.f(); }; // { dg-error "not captured|return" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice10.C new file mode 100644 index 000000000..1ea59c21c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice10.C @@ -0,0 +1,8 @@ +// PR c++/58568 +// { dg-do compile { target c++11 } } + +template<int> struct A +{ + static const int i; + template<int N> const int A<N>::i = []{ return 0; }(); // { dg-error "invalid use" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice11.C new file mode 100644 index 000000000..58f0fa35a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice11.C @@ -0,0 +1,12 @@ +// PR c++/60252 +// { dg-require-effective-target c++11 } + +struct A +{ + int i; // { dg-message "" } + + void foo() + { + [&](){ [&](int[i]){}; }; // { dg-error "" } + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice12.C new file mode 100644 index 000000000..d18aadfbd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice12.C @@ -0,0 +1,15 @@ +// PR c++/54250 +// { dg-do compile { target c++11 } } + +struct T +{ + int a; + int foo() + { + return [&]()->int { + return [&](decltype(/*this->*/a) _)->int { + return 1; + }(a); + }(); + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C new file mode 100644 index 000000000..6a31e0a36 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C @@ -0,0 +1,17 @@ +// PR c++/42083 +// { dg-do compile { target c++11 } } + +template<typename F> +decltype(F()) run(F f) // { dg-message "note" } +{ + return f(); +} + +int main() +{ + auto l = []() { return 5; }; // { dg-message "lambda closure type" } + + run(l); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 14 } + // { dg-error "use of deleted function" "candidate explanation" { target *-*-* } 5 } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C new file mode 100644 index 000000000..03a7a4bb6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C @@ -0,0 +1,23 @@ +// PR c++/47795 +// { dg-do compile { target c++11 } } + +class Klass +{ + unsigned int local; +public: + bool dostuff(); +}; + +bool Klass::dostuff() +{ + auto f = []() -> bool { + if (local & 1) { return true; } // { dg-error "not captured" } + return false; + }; +} + +int main() +{ + Klass c; + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice4.C new file mode 100644 index 000000000..8c08e909a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice4.C @@ -0,0 +1,14 @@ +// PR c++/47242 +// { dg-do compile { target c++11 } } + +template < typename > void +bar () +{ + [i]{}; // { dg-error "declared|invalid" } +} + +void +foo () +{ + bar<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C new file mode 100644 index 000000000..914e0f71e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C @@ -0,0 +1,12 @@ +// PR c++/51227 +// { dg-do compile { target c++11 } } + +template<int> int foo() +{ + [] (void i) { return 0; } (0); // { dg-error "incomplete|invalid|no match" } +} + +void bar() +{ + foo<0>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C new file mode 100644 index 000000000..408af4203 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C @@ -0,0 +1,4 @@ +// PR c++/51464 +// { dg-do compile { target c++11 } } + +template<int = sizeof([])> struct A {}; // { dg-error "lambda" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice7.C new file mode 100644 index 000000000..d0ee86611 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice7.C @@ -0,0 +1,9 @@ +// PR c++/52487 +// { dg-do compile { target c++11 } } + +struct A; // { dg-error "forward declaration" } + +void foo(A& a) +{ + [=](){a;}; // { dg-error "invalid use of incomplete type" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice8.C new file mode 100644 index 000000000..00078d53b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice8.C @@ -0,0 +1,10 @@ +// PR c++/51422 +// { dg-do compile { target c++11 } } + +template<typename> struct A {}; + +void foo() +{ + [i] { A<decltype(i)>(); }; // { dg-error "not declared|invalid" } + [i] { A<decltype(i)>(); }; // { dg-error "invalid" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice9.C new file mode 100644 index 000000000..0a88bc875 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice9.C @@ -0,0 +1,18 @@ +// PR c++/53741 +// { dg-do compile { target c++11 } } + +struct X +{ + template <class T> static void bar() {} + + template <class T> void foo(T p) + { + [&] { bar<T>(); }; + } +}; + +int main() +{ + X x; + x.foo(3); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class-neg.C new file mode 100644 index 000000000..92a165d95 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class-neg.C @@ -0,0 +1,35 @@ +// { dg-do compile { target c++11 } } + +#include <cassert> + +class C { + private: + int m_i; + + public: + C() : m_i(-1) { + [] { this; } (); // { dg-error "not captured" } + [this] () -> void { m_i = 0; } (); + assert(m_i == 0); + [this] () -> void { this->m_i = 1; } (); + assert(m_i == 1); + [&] () -> void { m_i = 2; } (); + assert(m_i == 2); + [&] () -> void { this->m_i = 3; } (); + assert(m_i == 3); + [=] () -> void { m_i = 4; } (); // copies 'this' or --copies-m_i--? + assert(m_i == 4); + [=] () -> void { this->m_i = 5; } (); + assert(m_i == 5); + } + +}; + +int main() { + C c; + + [this] () -> void {} (); // { dg-error "use of 'this' in non-member function" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class.C new file mode 100644 index 000000000..92981109f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class.C @@ -0,0 +1,35 @@ +// { dg-do run { target c++11 } } + +#include <cassert> + +class C { + private: + int m_i; + + public: + C() : m_i(-1) { + //[] { this; } (); + [this] () -> void { m_i = 0; } (); + assert(m_i == 0); + [this] () -> void { this->m_i = 1; } (); + assert(m_i == 1); + [&] () -> void { m_i = 2; } (); + assert(m_i == 2); + [&] () -> void { this->m_i = 3; } (); + assert(m_i == 3); + [=] () -> void { m_i = 4; } (); // copies 'this' or --copies-m_i--? + assert(m_i == 4); + [=] () -> void { this->m_i = 5; } (); + assert(m_i == 5); + } + +}; + +int main() { + C c; + + //[this] () -> void {} (); // { dg-error: "cannot capture `this' outside of class method" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist1.C new file mode 100644 index 000000000..029576eab --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist1.C @@ -0,0 +1,12 @@ +// PR c++/50863 +// { dg-do compile { target c++11 } } + +struct T { + template<typename F> + T(F) { } +}; + +int main() +{ + T t{ []{ } }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist2.C new file mode 100644 index 000000000..3c25f0eb9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist2.C @@ -0,0 +1,27 @@ +// PR c++/54947 +// { dg-do compile { target c++11 } } + +struct X +{ + template<typename L> + X(L) + { } +}; + +template<typename A> + void + test() + { + int i = 0; + + A a_ok_1( [=] { return i; } ); // OK + A a_ok_2( [i] { return i; } ); // OK + + A a_err_1{ [i] { return i; } }; // error + A a_err_2{ [=] { return i; } }; // error + } + +int main() +{ + test<X>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C new file mode 100644 index 000000000..f7b82efe9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C @@ -0,0 +1,11 @@ +// PR c++/56567 +// { dg-require-effective-target c++11 } + +#include <initializer_list> + +int main() +{ + []{ return { 1, 2 }; }(); // { dg-error "initializer.list" } +} + +// { dg-prune-output "return-statement with a value" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-intname.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-intname.C new file mode 100644 index 000000000..4c268c678 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-intname.C @@ -0,0 +1,6 @@ +// PR c++/54420 + +class __lambda +{ + virtual bool is_sub (); +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-lookup-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-lookup-neg.C new file mode 100644 index 000000000..a952526a1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-lookup-neg.C @@ -0,0 +1,7 @@ +// Test that we don't crash on a failed lookup. +// { dg-do compile { target c++11 } } + +int main() +{ + [i]{}; // { dg-error "not declared" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C new file mode 100644 index 000000000..220817a73 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C @@ -0,0 +1,104 @@ +// Test lambda mangling +// { dg-require-weak "" } +// { dg-do compile { target c++11 } } +// { dg-options "-fno-inline" } + +template<typename F> int algo(F fn) { return fn(); } +inline void g(int n) { + int bef(int i = []{ return 1; }()); + // Default arguments of block-extern function declarations + // remain in the context of the encloding function body. + // The closure type is encoded as Z1giEUlvE_. + // The call operator of that type is _ZZ1giENKUlvE_clEv. + +// { dg-final { scan-assembler "_ZZ1giENKUlvE_clEv" } } +// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZZ1giENKUlvE_clEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin } } } } } + + algo([=]{return n+bef();}); + // The captured entities do not participate in <lambda-sig> + // and so this closure type has the same <lambda-sig> as + // the previous one. It encoding is therefore Z1giEUlvE0_ + // and the call operator is _ZZ1giENKUlvE0_clEv. The + // instance of "algo" being called is then + // _Z4algoIZ1giEUlvE0_EiT_. + +// { dg-final { scan-assembler "_Z4algoIZ1giEUlvE0_EiT_" } } +// { dg-final { scan-assembler "_ZZ1giENKUlvE0_clEv" } } + + int i = []{return 1;}(); + +} + +struct S { + void f(int = + // Type: ZN1S1fEiiEd0_UlvE_ + // Operator: _ZZN1S1fEiiEd0_NKUlvE_clEv +// { dg-final { scan-assembler "_ZZN1S1fEiiEd0_NKUlvE_clEv" } } +// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZZN1S1fEiiEd0_NKUlvE_clEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin } } } } } + []{return 1;}() + // Type: ZN1S1fEiiEd0_UlvE0_ + // Operator: _ZZN1S1fEiiEd0_NKUlvE0_clEv +// { dg-final { scan-assembler "_ZZN1S1fEiiEd0_NKUlvE0_clEv" } } + + []{return 2;}(), + int = + // Type: ZN1S1fEiiEd_UlvE_ + // Operator: _ZZN1S1fEiiEd_NKUlvE_clEv +// { dg-final { scan-assembler "_ZZN1S1fEiiEd_NKUlvE_clEv" } } + []{return 3;}()); +}; + +template<typename T> struct R { + static int x; +}; +template<typename T> int R<T>::x = []{return 1;}(); +template int R<int>::x; +// Type of lambda in intializer of R<int>::x: N1RIiE1xMUlvE_E +// Corresponding operator(): _ZNK1RIiE1xMUlvE_clEv +// { dg-final { scan-assembler "_ZNK1RIiE1xMUlvE_clEv" } } +// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZNK1RIiE1xMUlvE_clEv" { target { ! { *-*-mingw* *-*-cygwin } } } } } + +void bar() +{ + // lambdas in non-vague linkage functions have internal linkage. + // { dg-final { scan-assembler-not "weak\[^\n\r\]*bar\[^\n\r\]*Ul" } } + []{}(); +} + +// lambdas used in non-template, non-class body initializers are internal. +// { dg-final { scan-assembler-not "weak\[^\n\r\]*_ZNKUlv" } } +// { dg-final { scan-assembler-not "weak\[^\n\r\]*variable" } } +int variable = []{return 1;}(); + +// And a template instantiated with such a lambda is also internal. +// { dg-final { scan-assembler-not "weak\[^\n\r\]*algoIUl" } } +int var2 = algo([]{return 1;}); + +// As are lambdas used in non-class-body default arguments. +// { dg-final { scan-assembler-not "weak\[^\n\r\]*function" } } +void function (int i = []{return 1;}()+[]{return 1;}()); + +struct Foo +{ + static int Int; + void Bar(int); +}; + +int Foo::Int = []{return 1;}(); +// Even default arguments for member functions that appear outside the +// class body are internal. +// { dg-final { scan-assembler-not "weak\[^\n\r\]*Foo" } } +void Foo::Bar(int i = []{return 1;}()) {} + +// Even default arguments for function templates. +// { dg-final { scan-assembler-not "weak\[^\n\r\]*fn2\[^\n\r\]*Ulv" } } +template <class T> +void fn2 (T t = []{return 1;}()) {} + +int main() +{ + g(42); + S().f(); + function(); + Foo().Bar(); + fn2<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle2.C new file mode 100644 index 000000000..54309a9dd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle2.C @@ -0,0 +1,20 @@ +// PR c++/49276 +// { dg-do compile { target c++11 } } + +template <int N> +struct F +{ + template <typename U> F (U); +}; + +struct S +{ + void foo (F <0> x = [] {}) {} +}; + +int +main () +{ + S s; + s.foo (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C new file mode 100644 index 000000000..5f17a21ca --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C @@ -0,0 +1,15 @@ +// PR c++/51818 +// { dg-do compile { target c++11 } } +// { dg-final { scan-assembler "_ZN1AC1IN3foo3barMUlvE_EEET_" } } + +struct A +{ + template <class T> A(T) { } +}; + +struct foo +{ + A bar = []{}; +}; + +foo f; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C new file mode 100644 index 000000000..0d37637fe --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C @@ -0,0 +1,13 @@ +// PR c++/54538 +// { dg-do compile { target c++11 } } + +template <class T> +struct A +{ + // { dg-final { scan-assembler "_ZNK1AIcE1pMUlvE_cvPFvvEEv" } } + // { dg-final { scan-assembler "_ZNK1AIiE1pMUlvE_cvPFvvEEv" } } + void (*p)() = []{}; +}; + +A<int> a1; +A<char> a2; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mixed.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mixed.C new file mode 100644 index 000000000..d3f434195 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mixed.C @@ -0,0 +1,12 @@ +// { dg-do run { target c++11 } } +#include <cassert> + +int main() { + int i = 1, j = 2; + [&i, j] () mutable -> void { i = 0; j = 0; } (); + assert(i == 0); + assert(j == 2); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable.C new file mode 100644 index 000000000..2c6b0f206 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable.C @@ -0,0 +1,15 @@ +// { dg-do run { target c++11 } } +#include <cassert> + +int main() { + int i = 1; + const char* s1 = "hello"; + const char* s2 = s1; + [i, s2] () mutable -> void { i = 2; s2 = "world"; } (); + //[i, s2] () -> void { i = 2; s2 = "world"; } (); // { dg-error: "assignment of data-member in read-only structure" } + assert(i == 1); + assert(s1 == s2); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable2.C new file mode 100644 index 000000000..c54ff5c84 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable2.C @@ -0,0 +1,23 @@ +// PR c++/55532 +// { dg-do compile { target c++11 } } + +struct Foo { + void doit() { + } +}; + +template<typename T> +void oops(Foo &foo, const T &) { + auto fun = [&] () mutable { + foo.doit(); + }; + auto fun2 = [=]() { + fun(); // { dg-error "" } + }; + fun2(); +} + +int main() { + Foo foo; + oops(foo, 1); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C new file mode 100644 index 000000000..a09af89ce --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C @@ -0,0 +1,10 @@ +// PR c++/56710 +// { dg-do compile { target c++11 } } +// { dg-options "-Wall" } + +int main() +{ + int t = 0; + return [&]() -> int {int __t; __t = t; return __t; }(); + return [&t]() -> int {int __t; __t = t; return __t; }(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested.C new file mode 100644 index 000000000..c8ea46a98 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested.C @@ -0,0 +1,62 @@ +// { dg-do run { target c++11 } } + +#include <cassert> + +struct A { + int i; + A(): i(42) { } + int f() { + return [this]{ + return [=]{ return i; }(); + }(); + } +}; + +int main() { + int i = 1; + + [] (int& i) -> void { + [&] () -> void { + i = 2; + } (); + } (i); + + assert(i == 2); + + [&] () -> void { + [&i] () -> void { + i = 3; + } (); + } (); + + assert(i == 3); + + [&] () -> void { + [&] () -> void { + i = 4; + } (); + } (); + + assert(i == 4); + i = 4; + + [&] () -> void { + [=] () mutable -> void { + i = 5; + } (); + } (); + + assert(i == 4); + + [=] () mutable -> void { + [&] () -> void { + i = 6; + } (); + } (); + + assert(i == 4); + + assert (A().f() == 42); + + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested2.C new file mode 100644 index 000000000..9e509513a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested2.C @@ -0,0 +1,31 @@ +// Testcase from N2998 +// { dg-do compile { target c++11 } } + +void f1(int i) { + int const N = 20; + auto m1 = [=]{ + int const M = 30; + auto m2 = [i]{ + int x[N][M]; // OK: N and M are not "used" + x[0][0] = i; // OK: i is explicitly captured by m2 + // and implicitly captured by m1 + }; + }; + struct s1 { + int f; + int work(int n) { + int m = n*n; + int j = 40; + auto m3 = [this,m]{ + /*auto m4=*/[&,j]{ // { dg-error "j. is not captured" } + int x = n; // { dg-error "n. is not captured" } + x += m; // OK: m implicitly captured by m4 + // and explicitly captured by m3 + x += i; // { dg-error "i. is not captured" } + x += f; // OK: this captured implicitly by m4 + // and explicitly by m3 + }; + }; + } + }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested3.C new file mode 100644 index 000000000..f7894fb40 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested3.C @@ -0,0 +1,12 @@ +// PR c++/41896 +// { dg-do compile { target c++11 } } + +void nested_lambda() +{ + float val; + + [val]() + { + [val](){}; + }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested4.C new file mode 100644 index 000000000..140ed30e4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested4.C @@ -0,0 +1,9 @@ +// PR c++/47687 +// { dg-do compile { target c++11 } } + +template <class T> struct A { }; + +auto inl = []{ return []{}; }(); +typedef decltype(inl) inlt; + +A<inlt> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-non-const.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-non-const.C new file mode 100644 index 000000000..b5a335eaf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-non-const.C @@ -0,0 +1,18 @@ +// { dg-do run { target c++11 } } + +#include <cassert> + +template<typename F> +void call(F f) { f(); } + +int main() { + call([] () -> void {}); + call([] () mutable -> void {}); + + int i = -1; + call([i] () mutable -> void { i = 0; }); + assert(i == -1); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nop.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nop.C new file mode 100644 index 000000000..4a04cfbfb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nop.C @@ -0,0 +1,18 @@ +// { dg-do run { target c++11 } } +#include <cassert> + +int main() { + int i = 1, j = 2; + [i, j] () -> void {} (); + assert(i == 1); + assert(j == 2); + [&i, &j] () -> void {} (); + assert(i == 1); + assert(j == 2); + [] (int x) -> void {} (1); + [] (int& x) -> void {} (i); + [] (int x, int y) -> void {} (i, j); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ns-scope.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ns-scope.C new file mode 100644 index 000000000..4729bb3b3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ns-scope.C @@ -0,0 +1,17 @@ +// { dg-do run { target c++11 } } + +auto f = [](int i) { return i+1; }; + +int g(int i = [] { return 237; }()) +{ + return i; +} + +int main() +{ + if (f(41) != 42) + return 1; + if (g() != 237) + return 2; + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi1.C new file mode 100644 index 000000000..94dc254fd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi1.C @@ -0,0 +1,10 @@ +// PR c++/56464 +// { dg-do run { target c++11 } } + +struct bug { bug*a = [&]{ return [=]{return this;}(); }(); }; +int main() +{ + bug b; + if (b.a != &b) + __builtin_abort (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi2.C new file mode 100644 index 000000000..73106d78b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi2.C @@ -0,0 +1,4 @@ +// PR c++/56565 +// { dg-do compile { target c++11 } } + +struct bug { int a; int *b = [&]{ return &a; }(); }; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi3.C new file mode 100644 index 000000000..da7e0bfed --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi3.C @@ -0,0 +1,9 @@ +// PR c++/55972 +// { dg-do compile { target c++11 } } + +class C +{ + void f(); + int j = 10; + int i = [this]() { return this->j; }(); +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi4.C new file mode 100644 index 000000000..b592f1550 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi4.C @@ -0,0 +1,14 @@ +// PR c++/51927 +// { dg-do compile { target c++11 } } + +struct function +{ + template<typename Functor> + function(Functor); +}; + +struct testee +{ + function l1 = []() { }; + function l2 = [=]() { l1; }; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi5.C new file mode 100644 index 000000000..1d2778fb5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi5.C @@ -0,0 +1,7 @@ +// PR c++/58596 +// { dg-do compile { target c++11 } } + +struct A +{ + int i = [] { return decltype(i)(); }(); +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nullptr.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nullptr.C new file mode 100644 index 000000000..1aadbb490 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nullptr.C @@ -0,0 +1,47 @@ +// PR c++/54170 +// { dg-do run { target c++11 } } + +#include <cassert> + +struct A; +typedef A* ptr; +typedef int (A::*pmf) (int); +typedef int (A::*pdm); + +int total; + +void add(int n) +{ + total += n; +} + +template <typename RType, typename Callable> +RType Call(Callable native_func, int arg) +{ + return native_func(arg); +} + +template <typename RType> +RType do_test(int delta) +{ + return Call<RType>([=](int delta) { add(delta); return nullptr; }, delta); +} + +template <typename RType> +void test() +{ + total = 0; + assert (!do_test<RType>(5)); + assert (total == 5); + assert (!do_test<RType>(20)); + assert (total == 25); + assert (!do_test<RType>(-256)); + assert (total == -231); +} + +int main() +{ + test<ptr>(); + test<pdm>(); + test<pmf>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-pass.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-pass.C new file mode 100644 index 000000000..d904ebee1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-pass.C @@ -0,0 +1,26 @@ +// { dg-do run { target c++11 } } + +#include <cassert> +#include <algorithm> + +template <typename F, typename A1> +void call(F f, const A1& arg1) { + f(arg1); +} + +int main() { + int i = 1; + call( + [&i] (int j) -> void { i = j; }, + 2 + ); + assert(i == 2); + + int A[] = {1, 2, 3, 4}; + int sum = 0; + std::for_each(A, A+4, [&sum] (int n) -> void { sum += n; }); + assert(sum == 10); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-qualified.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-qualified.C new file mode 100644 index 000000000..40b539a6d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-qualified.C @@ -0,0 +1,17 @@ +// PR c++/50089 +// { dg-do compile { target c++11 } } + +struct TestBase +{ + void foo() {} +}; + +struct Test : TestBase +{ + void foo() + { + [this]{ + /*this->*/TestBase::foo(); // ICE without this-> + }(); + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-recursive.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-recursive.C new file mode 100644 index 000000000..cbaeb1620 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-recursive.C @@ -0,0 +1,20 @@ +// { dg-do run { target c++11 } } + +//#include <iostream> +#include <functional> +#include <cassert> + +int main() { + + std::function<int(int)> fib = [&fib] (int n) -> int { + //std::cerr << "fib(" << n << ")\n"; + if (n <= 2) return 1; + else return fib(n-1) + fib(n-2); + }; + + assert(fib(5) == 5); + assert(fib(10) == 55); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref-default.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref-default.C new file mode 100644 index 000000000..6b86369db --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref-default.C @@ -0,0 +1,14 @@ +// { dg-do run { target c++11 } } + +#include <cassert> + +int main() { + int i = 1; + float j = 2.0; + [&] () -> void { i = 3; j = 4.0; } (); + assert(i == 3); + assert(j == 4.0); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref.C new file mode 100644 index 000000000..def13fdd6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref.C @@ -0,0 +1,14 @@ +// { dg-do run { target c++11 } } + +#include <cassert> + +int main() { + int i = 1; + float j = 2.0; + [&i, &j] () -> void { i = 3; j = 4.0; } (); + assert(i == 3); + assert(j == 4.0); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref2.C new file mode 100644 index 000000000..49705f502 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref2.C @@ -0,0 +1,12 @@ +// PR c++/49598 +// { dg-do run { target c++11 } } + +int +main() +{ + int i = 10; + int& ir = i; + + if ([=]{ return ir; }() != 10) + return 1; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C new file mode 100644 index 000000000..4b353b64c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C @@ -0,0 +1,26 @@ +// PR c++/57437 +// { dg-require-effective-target c++11 } + +struct A { + int i; + + A(): i(42) {} + A(const A&) = default; + A(A&& a): i(a.i) { a.i = 0; } +}; + +int main() +{ + A x; + + auto y = [x] () mutable { + x.i++; + return x; + }; + + if (y().i != 43) + __builtin_abort (); + + if (y().i != 44) + __builtin_abort (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-sfinae1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-sfinae1.C new file mode 100644 index 000000000..973f8a780 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-sfinae1.C @@ -0,0 +1,55 @@ +// PR c++/56039 +// { dg-do compile { target c++11 } } + +template <bool> struct BoolSink { typedef void type; }; + +template <typename T, typename U> +struct AddRvalueReferenceImpl { typedef T type; }; + +template <typename T> +struct AddRvalueReferenceImpl<T, typename BoolSink<false && + [] { + extern T &&tref; + }>::type> { // { dg-error "lambda" } + typedef T &&type; +}; + +template <typename T> +struct AddRvalueReference : AddRvalueReferenceImpl<T, void> { }; + +namespace ImplHelpers { + template <typename T> + typename AddRvalueReference<T>::type create(void) { } +} + +template <typename T, typename U, typename ...Args> +struct IsConstructibleImpl { enum { value = 0 }; }; + +template <typename T, typename ...Args> +struct IsConstructibleImpl<T, typename BoolSink<false && + [] { + T t( ::ImplHelpers::create<Args>() ...); + }>::type, Args ...> { // { dg-error "lambda" } + enum { value = 1 }; +}; + +template <typename T, typename ...Args> +struct IsConstructible : IsConstructibleImpl<T, void, Args ...> { }; + +struct DestroyMe { + ~DestroyMe() = delete; +}; + +static_assert(+IsConstructible<int>::value, "error"); +static_assert(!IsConstructible<void>::value, "error"); +static_assert(+IsConstructible<int [1]>::value, "error"); +static_assert(!IsConstructible<DestroyMe>::value, "error"); +static_assert(!IsConstructible<int *, char *>::value, "error"); + +static_assert(+IsConstructible<int &&, int>::value, "error"); +static_assert(!IsConstructible<int &&, int &>::value, "error"); +static_assert(+IsConstructible<int &&, int &&>::value, "error"); + +// { dg-prune-output "expected" } +// { dg-prune-output "does not name a class" } +// { dg-prune-output "static assertion" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow1.C new file mode 100644 index 000000000..fcfc39e3e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow1.C @@ -0,0 +1,10 @@ +// PR c++/55357 +// { dg-do compile { target c++11 } } +// { dg-options "-Wshadow" } + +int main() { + int x = 1; // { dg-message "shadowed" } + auto const lambda = [](int x) { // { dg-warning "shadows" } + return x; + }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow2.C new file mode 100644 index 000000000..6c042ca67 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow2.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-Wshadow" } + +struct A +{ + int i; + void f() + { + [=]{ int i; }; // { dg-warning "shadows" } + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-std-function.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-std-function.C new file mode 100644 index 000000000..a410384a4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-std-function.C @@ -0,0 +1,21 @@ +// Test using std::function wrapper. +// { dg-do run { target c++11 } } + +#include <functional> + +typedef std::function<int()> FN; + +template<typename T> +FN f(T fn) +{ + return [fn]{return fn(2);}; +} + +int main() +{ + auto fn = f([](int i){return i*21;}); + + if (fn() != 42) + return 1; + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-switch.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-switch.C new file mode 100644 index 000000000..1cac211dd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-switch.C @@ -0,0 +1,26 @@ +// PR c++/49867 +// { dg-do compile { target c++11 } } + +int +main () +{ + void (*l)(); + while (true) + { + switch (3) + { + struct A { + void f() + { + case 4: // { dg-error "case" } + break; // { dg-error "break" } + } + }; + l = []() + { + case 3: // { dg-error "case" } + break; // { dg-error "break" } + }; + } + } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-syntax1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-syntax1.C new file mode 100644 index 000000000..cb3ca94eb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-syntax1.C @@ -0,0 +1,5 @@ +// PR c++/46124 +// { dg-do compile { target c++11 } } + +void foo() { [] () -> void (); } // { dg-error "returning a function" "returning" } +// { dg-error "expected .\{" "expected" { target *-*-* } 4 } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template.C new file mode 100644 index 000000000..66cc7a4e1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template.C @@ -0,0 +1,40 @@ +// { dg-do run { target c++11 } } + +extern "C" void abort(); + +template <class T> +auto apply (T t) -> decltype (t()) +{ + return t(); +} + +template <class T> +T f(T t) +{ + T t2 = t; + if (t != [=]()->T { return t; }()) + abort (); + if (t != [=] { return t; }()) + abort (); + if (t != [=] { return t2; }()) + abort (); + if (t != [&] { return t; }()) + abort (); + if (t != apply([=]{return t;})) + abort (); + + int i; + [&] (int a) { return a+i+t; } (0); + [&] (int a) -> decltype(a) { return a+i+t; } (0); + [&] (int a) -> decltype(i) { return a+i+t; } (0); + [&] (int a) -> decltype(t) { return a+i+t; } (0); + [&] (int a) -> decltype(a+i) { return a+i+t; } (0); + [&] (int a) -> decltype(a+t) { return a+i+t; } (0); + [&] (int a) -> decltype(i+t) { return a+i+t; } (0); + [&] (int a) -> decltype(a+i+t) { return a+i+t; } (0); +} + +int main() +{ + f(0xbeef); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template10.C new file mode 100644 index 000000000..4fcc96527 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template10.C @@ -0,0 +1,23 @@ +// PR c++/50276 +// { dg-options "-Wuninitialized" } +// { dg-do run { target c++11 } } + +template<typename T> +unsigned testfun(const T& func) +{ + return func(); +} + +template<int i> +unsigned test() +{ + if (unsigned value = testfun( [] () { return 0; })) + return value; + return i; +} + +int main() +{ + if (test<42>() != 42) + __builtin_abort (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template11.C new file mode 100644 index 000000000..520b80488 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template11.C @@ -0,0 +1,25 @@ +// PR c++/56915 +// { dg-require-effective-target c++11 } + +template <typename T> +class A +{ + typename T::type b(); // { dg-error "int" } +}; + +template <typename T, typename U> +void waldo(T, U) {} + +template <typename T> +void bar() +{ + waldo([](A<T> a){ return a; }, + []{}); +} + +int main() +{ + bar<int>(); +} + +// { dg-prune-output "used but never defined" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template12.C new file mode 100644 index 000000000..635af97d7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template12.C @@ -0,0 +1,19 @@ +// PR c++/57568 +// { dg-require-effective-target c++11 } + +template < class T > +struct remove_reference +{ typedef int type; }; +template < class T > +class X +{ + enum Q { }; + bool f () + { + Q a; + [&a]{ + typename remove_reference < decltype (a) >::type t; + }; + } +}; +template class X< int >; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template2.C new file mode 100644 index 000000000..29f63afe0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template2.C @@ -0,0 +1,20 @@ +// PR c++/47049 +// { dg-do compile { target c++11 } } + +enum { E = 0, F = 1 }; +template <int N, int M = ((N == 1) ? F : E)> class S {}; +template <int N> +struct T +{ + static void + foo (S<N> *p) + { + S<N> u; + [&u] ()->bool {} (); + } +}; + +int main() +{ + T<0>().foo(0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template3.C new file mode 100644 index 000000000..dea9e0e4c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template3.C @@ -0,0 +1,33 @@ +// PR c++/49554 +// { dg-do compile { target c++11 } } + +template<typename T> + struct base + { + struct iterator { }; + + iterator begin(); + }; + +template<typename T> +class flist : public base<T> +{ + typedef base<T> Base; + + typedef typename Base::iterator Base_iterator; +public: + + void + resize() + { + Base_iterator b = Base::begin(); + + [b](int i) { return i; }; + } +}; + +void test01() +{ + flist<int> fl; + fl.resize(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template4.C new file mode 100644 index 000000000..a65727a1d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template4.C @@ -0,0 +1,42 @@ +// PR c++/51459 +// { dg-do run { target c++11 } } + +struct func { + virtual ~func() { } + virtual void operator()() const = 0; + virtual func* clone() const = 0; +}; + +template<typename T> +struct funcimpl : func { + explicit funcimpl(T t) : t(t) { } + void operator()() const { t(); } + func* clone() const { return new funcimpl(*this); } + T t; +}; + +struct function +{ + func* p; + + template<typename T> + function(T t) : p(new funcimpl<T>(t)) { } + + ~function() { delete p; } + + function(const function& f) : p(f.p->clone()) { } + + function& operator=(const function& ) = delete; + + void operator()() const { (*p)(); } +}; + +template <typename F> +function animate(F f) { return [=]{ f(); }; } + +int main() +{ + function linear1 = []{}; + function av(animate(linear1)); + av(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template5.C new file mode 100644 index 000000000..b91b89ff3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template5.C @@ -0,0 +1,17 @@ +// PR c++/53137 +// { dg-do compile { target c++11 } } + +struct A +{ + template <typename T> void f(); + + template <typename T> void g() + { + [this]{ f<T>(); }(); + } + + void h() + { + g<int>(); + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template6.C new file mode 100644 index 000000000..5e8561946 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template6.C @@ -0,0 +1,14 @@ +// PR c++/53821 +// { dg-final { scan-assembler-not "_ZZ1fIvEvvENKUlvE_cvPFvvEEv" } } +// { dg-do compile { target c++11 } } + +template <class T> void f() +{ + auto g = []{}; + g(); +} + +int main() +{ + f<void>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template7.C new file mode 100644 index 000000000..5b098d0df --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template7.C @@ -0,0 +1,5 @@ +// PR c++/53783 +// { dg-do compile { target c++11 } } + +template <class T> void foo() { [] { [] {}; }; } +int main() { foo<void>(); } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template8.C new file mode 100644 index 000000000..720941dbc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template8.C @@ -0,0 +1,7 @@ +// PR c++/55680 +// { dg-do compile { target c++11 } } + +template <class T> struct X { + static void (* code ) (); +}; +template <> void (* X<int>::code ) () = [](){}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template9.C new file mode 100644 index 000000000..c1d010ba1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template9.C @@ -0,0 +1,15 @@ +// PR c++/54276 +// { dg-do link { target c++11 } } + +template <typename T> +void foo(T) +{ + static int x = 1; + auto f = [] { return x + 1; }; + f(); +} + +int main() +{ + foo(4); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this.C new file mode 100644 index 000000000..b32f8d7cc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this.C @@ -0,0 +1,13 @@ +// Test that implicit 'this' capture works, but that it's still an rvalue. +// { dg-do compile { target c++11 } } + +struct A +{ + int i; + void f() + { + [=] { i = 0; }; + [&] { i = 0; }; + [=] { this = 0; }; // { dg-error "lvalue" } + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this10.C new file mode 100644 index 000000000..b4b8e7201 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this10.C @@ -0,0 +1,4 @@ +// PR c++/54383 +// { dg-do compile { target c++11 } } + +auto foo = [&](int a) { return a > this->b; }; // { dg-error "this" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this11.C new file mode 100644 index 000000000..261829566 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this11.C @@ -0,0 +1,22 @@ +// PR c++/51494, c++/56222 +// Uses of static members and creating pointers to members aren't odr-uses +// of 'this'. +// { dg-do compile { target c++11 } } + +struct A +{ + static void f() {} + static int i; + int j; + void f(int); + + void foo() + { + [] () { + ++i; + f(); + &A::j; + (void(*)())&A::f; + }; + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this12.C new file mode 100644 index 000000000..ef573b19e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this12.C @@ -0,0 +1,13 @@ +// Uses of 'this' in unevaluated context are not odr-uses. +// { dg-do compile { target c++11 } } + +struct A +{ + int f() {} + int i; + + void foo() + { + [] () { sizeof(i); sizeof(f()); }; + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this13.C new file mode 100644 index 000000000..090d0a13e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this13.C @@ -0,0 +1,20 @@ +// PR c++/52374 +// { dg-do compile { target c++11 } } + +struct B +{ + int get() const { return 42; } +}; + +template<typename X> +struct D + : public X +{ + int get() const { return [this]() -> int { return X::get(); }(); } +}; + +int main() +{ + D<B> d; + d.get(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this14.C new file mode 100644 index 000000000..9834bfdb3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this14.C @@ -0,0 +1,49 @@ +// PR c++/52014 +// { dg-require-effective-target c++11 } + +template <class Iterator, class Func> +void for_each(const Iterator first, const Iterator last, Func func) +{ + for (Iterator it = first; it != last; ++it) { + func(*it); + } +} + +template <class T> +struct helper +{ + typedef typename T::size_type type; +}; + +template <class T> +struct helper<T&> +{ + typedef typename T::size_type type; +}; + +template <class T> +struct helper<T*> +{ + typedef typename T::size_type type; +}; + +struct bar +{ + struct foo + { + typedef int size_type; + } foo_; + + void test() + { + int arr[] = { 1, 2, 3 }; + for_each(arr, arr + 3, [&](helper<foo>::type i) { + for_each(arr, arr + 3, [&](helper<decltype(foo_)>::type j) { }); + }); + } +}; + +int main() +{ + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this15.C new file mode 100644 index 000000000..d44bec949 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this15.C @@ -0,0 +1,12 @@ +// PR c++/56692 +// { dg-require-effective-target c++11 } + +struct Class { + void f () { } + static void f (int) { } +}; + +int main () +{ + []{ Class::f(0); }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this16.C new file mode 100644 index 000000000..736d5f50e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this16.C @@ -0,0 +1,28 @@ +// PR c++/56699 +// { dg-require-effective-target c++11 } + +struct A +{ + int a; +}; + +struct T +{ + int x; + + T() : x([]{ + sizeof(::A::a); + return 0; + }()) + {} +}; + +struct B +{ + int a; +}; + +void f() +{ + []{sizeof(B::a);}; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this17.C new file mode 100644 index 000000000..2386e6b1e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this17.C @@ -0,0 +1,21 @@ +// PR c++/58481 +// { dg-require-effective-target c++11 } + +struct Test { + template<typename... Args> inline void triggerTest (Args&&... fargs) { } +}; + +struct TestPickled : Test { + template<typename... Args> void triggerTest (Args&&... fargs) { + [=](Args... as) { + Test::triggerTest (as...); + } (); + } +}; + +int main() +{ + TestPickled test; + test.triggerTest (); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this2.C new file mode 100644 index 000000000..5029a4a76 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this2.C @@ -0,0 +1,17 @@ +// PR c++/43856 +// Test for implicit 'this' capture via rewriting. +// { dg-do compile { target c++11 } } + +struct S1 { + int operator()(int); + int i; + void g(); + void f() { + [=]() { + i; + g(); + S1::g(); + operator()(42); + }; + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C new file mode 100644 index 000000000..2defa9989 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C @@ -0,0 +1,14 @@ +// PR c++/45520 +// { dg-do compile { target c++11 } } + +struct M { + int i; +}; + +struct S { + M m; + + void f() { + auto lambda=[&](decltype(m.i) & i) { }; + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this4.C new file mode 100644 index 000000000..f14a2723d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this4.C @@ -0,0 +1,13 @@ +// PR c++/48523 +// { dg-do compile { target c++11 } } + +template<typename> +struct X +{ + bool b; + + void f() + { + [this]{ return b; }; + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this5.C new file mode 100644 index 000000000..897464164 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this5.C @@ -0,0 +1,22 @@ +// PR c++/53619 +// { dg-do run { target c++11 } } + +struct C { + int x; +}; +struct B { + int q; +}; +struct A : public B , C { + void foo(); +}; + +void A::foo() { + auto k = [this]() {return (void *)(&x);}; + if (k() != (void*)&x) + __builtin_abort(); +} + +int main(int l, char **) { + A a; a.foo(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this6.C new file mode 100644 index 000000000..8c35126e9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this6.C @@ -0,0 +1,32 @@ +// PR c++/53137 +// { dg-do compile { target c++11 } } + +template <typename STORE> +void getParent(STORE& tStore) +{ +} + +struct Store +{ + template <typename CheckParentFunc> + void updateChildCommon(CheckParentFunc c) + { + c(); + } + + template <typename T> + int& getStore(); + + template <typename T> + void updateChild(const T& obj) + { + updateChildCommon([this] () { getParent(getStore<T>()); }); + } + + void update(int obj); +}; + +void Store::update(int obj) +{ + updateChild(obj); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this7.C new file mode 100644 index 000000000..ee202032a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this7.C @@ -0,0 +1,11 @@ +// PR c++/54122 +// { dg-do compile { target c++11 } } + +enum E { F }; + +template <typename A> +struct C +{ + E e; + void f () { auto l = [&](void)->void { if (e == F) return; }; } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this8.C new file mode 100644 index 000000000..d7c5d2c05 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this8.C @@ -0,0 +1,37 @@ +// PR c++/56135 +// { dg-do run { target c++11 } } + +#include <functional> + +struct test { + template<typename T> + std::function<void()> broken(int x) { + return [=] { +x; print<T>(); }; + } + + std::function<void()> works0() { + return [=] { print<int>(); }; + } + + template<typename T> + std::function<void()> works1() { + return [=] { print<int>(); }; + } + + template<typename T> + std::function<void()> works2() { + return [=] { this->print<T>(); }; + } + + template<typename T> + void print() { if (this == 0) __builtin_abort (); } +}; + +int main(void) { + test().broken<int>(1)(); + test().works0()(); + test().works1<int>()(); + test().works2<int>()(); + + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this9.C new file mode 100644 index 000000000..07ddd0863 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this9.C @@ -0,0 +1,19 @@ +// PR c++/54277 +// { dg-do compile { target c++11 } } + +struct Used +{ + void foo() { } +}; + +template <typename> +struct S +{ + Used x; + + void bar() + { + auto f = [this] { x.foo(); }; + f(); + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-type.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-type.C new file mode 100644 index 000000000..a0c17ad16 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-type.C @@ -0,0 +1,74 @@ +// Every id-expression that is a use (_basic.def.odr_ 3.2) of an entity +// captured by copy is transformed into an access to the corresponding +// unnamed data member of the closure type. +//... +// Every occurrence of decltype((x)) where x is a possibly parenthesized +// id-expression that names an entity of automatic storage duration is +// treated as if x were transformed into an access to a corresponding data +// member of the closure type that would have been declared if x were a use +// of the denoted entity. + +// So, other appearances of 'x' within decltype do not refer to the closure +// member, because they are not "use"s in the sense of 3.2. + +// { dg-do compile { target c++11 } } + +template<class T, class U> +struct same_type; +template <class T> +struct same_type<T,T> { }; + +int main() +{ + int i; + [=] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int const&>(); + i+1; + same_type<decltype((i)),int const&>(); + same_type<decltype(i),int>(); + }; + [=] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int const&>(); + same_type<decltype(i),int>(); + }; + [=] () mutable { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + same_type<decltype(i),int>(); + }; + [&] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + same_type<decltype(i),int>(); + }; + [i] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int const&>(); + }; + [&,i] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int const&>(); + }; + [i] () mutable { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + }; + [&,i] () mutable { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + }; + [&i] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + }; + [=,&i] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + }; + [] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int const&>(); // { dg-error "" "not captured" } + }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-typedef.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-typedef.C new file mode 100644 index 000000000..e1d1b5041 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-typedef.C @@ -0,0 +1,26 @@ +// PR c++/54975 +// { dg-do compile { target c++11 } } + +template<typename T> +struct identity +{ + typedef T type; +}; + +template<typename T> +void f() +{ + typedef typename T::type A; + int i = 42; + int const &cri = i; + int volatile &vri = i; + [&]() { + A const &x = cri; // Problem here + A volatile &y = vri; // Likewise + }; +} + +int main() +{ + f<identity<int> >(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C new file mode 100644 index 000000000..898f685aa --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C @@ -0,0 +1,7 @@ +// 5.1.2/2: A lambda-expression shall not appear in an unevaluated operand. +// { dg-do compile { target c++11 } } + +template <class T> +struct A { }; +A<decltype([]{ return 1; }())> a; // { dg-error "lambda.*unevaluated context" } + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use.C new file mode 100644 index 000000000..73677c0e7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +int main(int argc, char** argv) +{ + int i; + int &ir = i; + const int ci = 1; + const int &cir = ci; + + [] { sizeof (argc); sizeof (i); sizeof (ir); sizeof (ci); sizeof (cir); }; + [] { int ia[ci]; }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C new file mode 100644 index 000000000..96af09c5c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C @@ -0,0 +1,12 @@ +// PR c++/50224 +// { dg-do compile { target c++11 } } +// { dg-options "-Wunused-parameter" } + +struct T; + +void m(T& t) // ERROR here +{ + [&]{ + t; // ``t`` is referenced here + }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic1.C new file mode 100644 index 000000000..e85f2bcff --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic1.C @@ -0,0 +1,15 @@ +// PR c++/49672 +// { dg-do compile { target c++11 } } + +template<typename ... Args> +static void foo() +{ + [](Args..., int x) { + x; + }; +} + +int main() +{ + foo(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic2.C new file mode 100644 index 000000000..fab1f6ca6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic2.C @@ -0,0 +1,57 @@ +// { dg-do run { target c++11 } } + +int g() { return 0; } +template <class T, class... U> +int g(T t, U... u) +{ + return t + g(u...); +} + +template <class... T> +int f1(T... t) +{ + return [t...] { + return g(t...); + }(); +} + +template <class... T> +int f2(T... t) +{ + return [&t...] { + return g(t...); + }(); +} + +template <class... T> +int f3(T... t) +{ + return [=] { + return g(t...); + }(); +} + +template <class... T> +int f4(T... t) +{ + return [&] { + return g(t...); + }(); +} + +#define assert(E) do { if (!(E)) __builtin_abort(); } while(0) +int main() +{ + assert (f1() == 0); + assert (f2() == 0); + assert (f3() == 0); + assert (f4() == 0); + assert (f1(42) == 42); + assert (f2(42) == 42); + assert (f3(42) == 42); + assert (f4(42) == 42); + assert (f1(1,2,3) == 6); + assert (f2(1,2,3) == 6); + assert (f3(1,2,3) == 6); + assert (f4(1,2,3) == 6); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn1.C new file mode 100644 index 000000000..f86c4b6d1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn1.C @@ -0,0 +1,9 @@ +// PR c++/41920 +// { dg-do compile { target c++11 } } +// { dg-options "-Wall -Wextra" } + +int foo(int i) +{ + auto bar = [=](){ return i; }; + return bar(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn2.C new file mode 100644 index 000000000..6542392ef --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn2.C @@ -0,0 +1,8 @@ +// PR c++/42370 +// { dg-do compile { target c++11 } } +// { dg-options "-Wall" } + +void foo() +{ + []{ return 0; }(); +} // { dg-bogus "no return statement" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn3.C new file mode 100644 index 000000000..5c5b24c13 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn3.C @@ -0,0 +1,13 @@ +// PR c++/49482 +// { dg-do compile { target c++11 } } +// { dg-options "-Wunused-but-set-parameter" } + +template<class T> +void f() { + []( bool b ){ return b; }; +} + +int main() +{ + f<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn4.C new file mode 100644 index 000000000..059c198ff --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn4.C @@ -0,0 +1,8 @@ +// PR c++/52845 +// { dg-do compile { target c++11 } } +// { dg-options "-Wall" } + +void f() +{ + [](){}; +} |