|
1 |
| -// RUN: %clang_cc1 -std=c++20 -ferror-limit 0 -verify %s |
| 1 | +// RUN: %clang_cc1 -std=c++20 -ferror-limit 0 -verify=expected,cxx20 %s |
| 2 | +// RUN: %clang_cc1 -std=c++2c -ferror-limit 0 -verify=expected %s |
2 | 3 |
|
3 | 4 | namespace PR47043 {
|
4 | 5 | template<typename T> concept True = true;
|
@@ -1405,3 +1406,41 @@ static_assert(!std::is_constructible_v<span<4>, array<int, 3>>);
|
1405 | 1406 | }
|
1406 | 1407 |
|
1407 | 1408 | }
|
| 1409 | + |
| 1410 | + |
| 1411 | +namespace GH162125 { |
| 1412 | +template<typename, int size> |
| 1413 | +concept true_int = (size, true); |
| 1414 | + |
| 1415 | +template<typename, typename... Ts> |
| 1416 | +concept true_types = true_int<void, sizeof...(Ts)>; |
| 1417 | + |
| 1418 | +template<typename, typename... Ts> |
| 1419 | +concept true_types2 = true_int<void, Ts...[0]{1}>; // cxx20-warning {{pack indexing is a C++2c extension}} |
| 1420 | + |
| 1421 | +template<typename... Ts> |
| 1422 | +struct s { |
| 1423 | + template<typename T> requires true_types<T, Ts...> && true_types2<T, Ts...> |
| 1424 | + static void f(T); |
| 1425 | +}; |
| 1426 | +void(*test)(int) = &s<bool>::f<int>; |
| 1427 | +} |
| 1428 | + |
| 1429 | +namespace GH162125_reversed { |
| 1430 | +template<int size, typename> |
| 1431 | +concept true_int = (size, true); |
| 1432 | + |
| 1433 | +template<typename, typename... Ts> |
| 1434 | +concept true_types = true_int<sizeof...(Ts), void>; |
| 1435 | + |
| 1436 | +template<typename, typename... Ts> |
| 1437 | +concept true_types2 = true_int<Ts...[0]{1}, void>; // cxx20-warning {{pack indexing is a C++2c extension}} |
| 1438 | + |
| 1439 | +template<typename... Ts> |
| 1440 | +struct s { |
| 1441 | + template<typename T> requires true_types<T, Ts...> && true_types2<T, Ts...> |
| 1442 | + static void f(T); |
| 1443 | +}; |
| 1444 | + |
| 1445 | +void(*test)(int) = &s<bool>::f<int>; |
| 1446 | +} |
0 commit comments