// Testcase for N3276 and operator overloading // { dg-require-effective-target c++11 } struct A; struct B { A operator()(int); A operator[](int); A operator=(int); A operator+=(int); A operator-=(int); A operator*=(int); A operator/=(int); A operator^=(int); A operator&=(int); A operator|=(int); A operator<<=(int); A operator>>=(int); }; A operator-(B); A operator+(B); A operator*(B); A operator&(B); A operator!(B); A operator~(B); A operator++(B); A operator--(B); A operator+(B,B); A operator-(B,B); A operator*(B,B); A operator/(B,B); A operator%(B,B); A operator^(B,B); A operator&(B,B); A operator|(B,B); A operator<(B,B); A operator>(B,B); A operator,(B,B); A operator<<(B,B); A operator>>(B,B); A operator==(B,B); A operator->*(B,B); #define TRY(E) static_cast(0) template void f() { B b; TRY(b(0)); TRY(b[0]); TRY(b=0); TRY(b+=0); TRY(b-=0); TRY(b*=0); TRY(b/=0); TRY(b^=0); TRY(b&=0); TRY(b|=0); TRY(b<<=0); TRY(b>>=0); TRY(-b); TRY(+b); TRY(*b); TRY(&b); TRY(!b); TRY(~b); TRY(++b); TRY(--b); TRY(b+b); TRY(b-b); TRY(b*b); TRY(b/b); TRY(b%b); TRY(b^b); TRY(b&b); TRY(b|b); TRY(b>b); TRY(b>b); TRY(b==b); TRY(b->*b); } int main() { B b; TRY(b(0)); TRY(b[0]); TRY(b=0); TRY(b+=0); TRY(b-=0); TRY(b*=0); TRY(b/=0); TRY(b^=0); TRY(b&=0); TRY(b|=0); TRY(b<<=0); TRY(b>>=0); TRY(-b); TRY(+b); TRY(*b); TRY(&b); TRY(!b); TRY(~b); TRY(++b); TRY(--b); TRY(b+b); TRY(b-b); TRY(b*b); TRY(b/b); TRY(b%b); TRY(b^b); TRY(b&b); TRY(b|b); TRY(b>b); TRY(b>b); TRY(b==b); TRY(b->*b); f(); }