The following code produces an error when evaluating the concept. auto foo(auto a, auto... i) -> decltype(auto) { if constexpr (requires { a[i...]; }) { return a[i...]; } else { return a; } } int x = foo(1); > <source>: In instantiation of 'decltype(auto) foo(auto:1, auto:2 ...) [with auto:1 = int; auto:2 = {}]': > <source>:10:12: required from here > <source>:2:31: error: built-in subscript operator without expression list > 2 | if constexpr (requires { a[i...]; }) { > | ~^ > Compiler returned: 1 Workaround: specialize on sizeof...(i) to avoid this test when i... is empty. Live example: https://godbolt.org/z/K3oezd1qz
Confirmed, even this is rejected: ``` auto foo(auto a, auto... i) -> decltype(auto) { if constexpr (requires { a[i...]; }) { return a[i...]; } else { return a; } } int x = foo(1, 1); ``` Note clang just ICEs. Also the above works if it is not a variable argument auto ... That is: ``` template<typename T, typename T1> auto foo(T a, T1 i) { if constexpr (requires { a[i]; }) { return a[i]; } else { return a; } } int x = foo(1, 1); ``` Compiles just fine.
dup of the recently fixed PR111493 *** This bug has been marked as a duplicate of bug 111493 ***