1 // Explicit generic lambda test from N3690 5.1.2.5
2 // { dg-do compile { target c++14 } }
3 // { dg-options "-Wpedantic" }
4 
5 #include <iostream>
6 
main()7 int main()
8 {
9    auto glambda = [] <typename A, typename B> (A a, B&& b) { return a < b; };	// { dg-warning "lambda templates are only available with" "" { target c++17_down } }
10    bool b = glambda(3, 3.14); // OK
11    auto vglambda = [] <typename P> (P printer) {				// { dg-warning "lambda templates are only available with" "" { target c++17_down } }
12      return [=] <typename... T> (T&& ... ts) { // OK: ts is a function parameter pack
13        printer(std::forward<decltype(ts)>(ts)...);				// { dg-warning "lambda templates are only available with" "" { target c++17_down } .-1 }
14        return [=]() {
15          printer(ts ...);
16        };
17      };
18    };
19    auto p = vglambda( [] <typename A,						// { dg-warning "lambda templates are only available with" "" { target c++17_down } }
20                           typename B,
21                           typename C> (A v1, B v2, C v3)
22      { std::cout << v1 << v2 << v3; } );
23    auto q = p(1, 'a', 3.14); // OK: outputs 1a3.14
24    q(); // OK: outputs 1a3.14
25 }
26 
27