blob: 27797a2fa314df928655eb380ac8791a2ec07537 [file] [log] [blame]
// 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<decltype(E)*>(0)
template <class B>
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);
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);
TRY(b>>b);
TRY(b==b);
TRY(b->*b);
f<B>();
}