| 1 | #include <fstream.hfa>
 | 
|---|
| 2 | 
 | 
|---|
| 3 | void foo(zero_t)
 | 
|---|
| 4 | {
 | 
|---|
| 5 |         sout | "It's a Zero!";
 | 
|---|
| 6 | }
 | 
|---|
| 7 | 
 | 
|---|
| 8 | void foo(one_t)
 | 
|---|
| 9 | {
 | 
|---|
| 10 |         sout | "It's a One!";
 | 
|---|
| 11 | }
 | 
|---|
| 12 | 
 | 
|---|
| 13 | void foo(int)
 | 
|---|
| 14 | {
 | 
|---|
| 15 |         sout | "It's a Number!";
 | 
|---|
| 16 | }
 | 
|---|
| 17 | 
 | 
|---|
| 18 | void testOverloads()
 | 
|---|
| 19 | {
 | 
|---|
| 20 |         foo(0);
 | 
|---|
| 21 |         foo(1);
 | 
|---|
| 22 |         foo(2);
 | 
|---|
| 23 | }
 | 
|---|
| 24 | 
 | 
|---|
| 25 | struct S { int i, j; };
 | 
|---|
| 26 | void ?{}( S & s, zero_t ) { s.[i,j] = 0; }                              // constructors
 | 
|---|
| 27 | void ?{}( S & s, one_t ) { s.[i,j] = 1; }
 | 
|---|
| 28 | S ?=?( S & dst, zero_t ) { dst.[i,j] = 0; return dst; } // assignment
 | 
|---|
| 29 | S ?=?( S & dst, one_t ) { dst.[i,j] = 1; return dst; }
 | 
|---|
| 30 | S ?+=?( S & s, one_t ) { s.[i,j] += 1; return s; }              // increment/decrement each field
 | 
|---|
| 31 | S ?-=?( S & s, one_t ) { s.[i,j] -= 1; return s; }
 | 
|---|
| 32 | int ?!=?( S s, zero_t ) { return s.i != 0 && s.j != 0; } // comparison
 | 
|---|
| 33 | void testInitAssignQueryIncrement() {
 | 
|---|
| 34 |         S s = 0;                                                                                        // initialization
 | 
|---|
| 35 |         s = 0;                                                                                          // assignments
 | 
|---|
| 36 |         s = 1;
 | 
|---|
| 37 |         if ( s ) ++s;                                                                           // special, unary ++/-\,- come from +=/-=
 | 
|---|
| 38 |         sout | s.i | s.j;
 | 
|---|
| 39 | }
 | 
|---|
| 40 | 
 | 
|---|
| 41 | void testCompats() {
 | 
|---|
| 42 |     zero_t zero = 0;
 | 
|---|
| 43 |     one_t one = 1;
 | 
|---|
| 44 | 
 | 
|---|
| 45 |     int x = 0;
 | 
|---|
| 46 |         int xx = zero;
 | 
|---|
| 47 | 
 | 
|---|
| 48 |         sout | x | xx;
 | 
|---|
| 49 | 
 | 
|---|
| 50 |         x = xx = 42;
 | 
|---|
| 51 |         sout | x | xx;
 | 
|---|
| 52 | 
 | 
|---|
| 53 |         x = 0;
 | 
|---|
| 54 |         xx = zero;
 | 
|---|
| 55 |         sout | x | xx;
 | 
|---|
| 56 | 
 | 
|---|
| 57 |         int y = 1;
 | 
|---|
| 58 |         int yy = one;
 | 
|---|
| 59 | 
 | 
|---|
| 60 |         sout | y | yy;
 | 
|---|
| 61 | 
 | 
|---|
| 62 |         y = yy = 42;
 | 
|---|
| 63 |         sout | y | yy;
 | 
|---|
| 64 | 
 | 
|---|
| 65 |         y = 1;
 | 
|---|
| 66 |         yy = one;
 | 
|---|
| 67 |         sout | y | yy;
 | 
|---|
| 68 | 
 | 
|---|
| 69 |         void z_helper( int * p, zero_t z ) {
 | 
|---|
| 70 |                 p = z;  // expect z not reported unused here; expect no missing cast from -Wint-conversion
 | 
|---|
| 71 |                 sout | "zero" | (bool) (p == 0);
 | 
|---|
| 72 |         }
 | 
|---|
| 73 | 
 | 
|---|
| 74 |         void z_call( int * p, zero_t z ) {
 | 
|---|
| 75 |                 z_helper(p, z);
 | 
|---|
| 76 |         }
 | 
|---|
| 77 | 
 | 
|---|
| 78 |         void o_helper( int * p, one_t o ) {
 | 
|---|
| 79 |           #ifdef ERR1
 | 
|---|
| 80 |                 p = o;
 | 
|---|
| 81 |           #else
 | 
|---|
| 82 |                 (void) x;  (void) o;
 | 
|---|
| 83 |           #endif
 | 
|---|
| 84 |                 sout | "one" | (bool) (p == 0);
 | 
|---|
| 85 |         }
 | 
|---|
| 86 | 
 | 
|---|
| 87 |         void o_call( int * p, one_t o ) {
 | 
|---|
| 88 |                 o_helper(p, o);
 | 
|---|
| 89 |         }
 | 
|---|
| 90 | 
 | 
|---|
| 91 |         z_call( &x, 0 );
 | 
|---|
| 92 |         z_call( &x, zero );
 | 
|---|
| 93 | 
 | 
|---|
| 94 |         o_call( &x, 1 );
 | 
|---|
| 95 |         o_call( &x, one );
 | 
|---|
| 96 | }
 | 
|---|
| 97 | 
 | 
|---|
| 98 | int main() {
 | 
|---|
| 99 |         testOverloads();
 | 
|---|
| 100 |         testInitAssignQueryIncrement();
 | 
|---|
| 101 |         testCompats();
 | 
|---|
| 102 |         return 0;
 | 
|---|
| 103 | }
 | 
|---|