PR c++/86728 - C variadic generic lambda.
[official-gcc.git] / gcc / testsuite / g++.dg / concepts / dr1430.C
blob9fd4f4301fcd86d44dd1380c25bc0724a91a22d2
1 // PR c++/66092
2 // { dg-options "-std=c++17 -fconcepts" }
4 #include <type_traits>
6 template <typename T, typename U, typename... Args>
7 requires (sizeof...(Args) == 0)
8   constexpr decltype(auto) check()
9   {
10     return std::integral_constant<bool, __is_same_as(T, U)>();
11   }
13 template <typename T, typename U, typename... Args>
14 requires (sizeof...(Args) > 0)
15   constexpr decltype(auto) check()
16   {
17     return std::integral_constant<bool, __is_same_as(T, U)
18         && decltype(check<U, Args...>())::value>();
19   }
21 template <typename T, typename U, typename... Args>
22   concept bool Same()
23   {
24     return decltype(check<T, U, Args...>())::value;
25   }
27 template <typename T, typename U, typename... Args>
28   concept bool Similar = true;
30 template <typename... Args>
31 requires Same<Args...>() // { dg-error "invalid reference" }
32   void foo( Args... args ) {}
34 template <typename... Args>
35 requires Similar<Args...> // { dg-error "invalid reference" }
36   void bar( Args... args ) {}
38 int main()
40   foo(1, 2, 3); // { dg-error "cannot call" }
41   bar(1, 2, 3); // { dg-error "cannot call" }