// RUN: %clang_cc1 -verify -std=c++2b %s
namespaceN{voidempty(){structS{intoperator[]();// expected-note{{not viable: requires 0 arguments, but 1 was provided}}
};
S{}[];
S{}[1];// expected-error {{no viable overloaded operator[] for type 'S'}}
}voiddefault_var(){structS{constexprintoperator[](inti=42){return i;}// expected-note {{not viable: allows at most single argument 'i'}}
};static_assert(S{}[]==42);static_assert(S{}[1]==1);static_assert(S{}[1,2]==1);// expected-error {{no viable overloaded operator[] for type 'S'}}
}structVariadic{constexprintoperator[](auto...i){return(42+...+ i);}};voidvariadic(){static_assert(Variadic{}[]==42);static_assert(Variadic{}[1]==43);static_assert(Variadic{}[1,2]==45);}voidmultiple(){structS{constexprintoperator[](){return0;}constexprintoperator[](int){return1;};constexprintoperator[](int,int){return2;};};static_assert(S{}[]==0);static_assert(S{}[1]==1);static_assert(S{}[1,1]==2);}voidambiguous(){structS{constexprintoperator[](){return0;}// expected-note{{candidate function}}
constexprintoperator[](int=0){return1;};// expected-note{{candidate function}}
};static_assert(S{}[]==0);// expected-error{{call to subscript operator of type 'S' is ambiguous}}
}}// namespace N
template<typename... T>structT1{constexprautooperator[](T...arg){// expected-note {{candidate function not viable: requires 2 arguments, but 1 was provided}}
return(1+...+ arg);}};static_assert(T1<>{}[]==1);static_assert(T1<int>{}[1]==2);static_assert(T1<int,int>{}[1,1]==3);static_assert(T1<int,int>{}[1]==3);// expected-error {{no viable overloaded operator[] for type 'T1<int, int>'}}
structT2{constexprautooperator[](auto...arg){return(1+...+ arg);}};static_assert(T2{}[]==1);static_assert(T2{}[1]==2);static_assert(T2{}[1,1]==3);