1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
// 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>();
}
|