source: tests/zero_one.cfa @ 62b5940

Last change on this file since 62b5940 was 7959e56, checked in by Michael Brooks <mlbrooks@…>, 8 weeks ago

Eliminate libcfa-build warnings of missing int-to-pointer casts.

Replace a zero_t variable use with literal 0 when it's an argument to an intrinsic and we're generating final C code. Partially revert e0330d2cd1a. Such intrinsics are initialization/assignment of pointers; using the variable implies a missing cast, while using literal 0 needs no cast.

CodeGenerator?.hpp
CodeGenerator?.cpp

Put attibute unused on all zero_t/one_t object decls. It is needed on those whose uses are rewritten by the rule above.

Generate.cpp

  • Property mode set to 100644
File size: 1.7 KB
Line 
1#include <fstream.hfa>
2
3void foo(zero_t)
4{
5        sout | "It's a Zero!";
6}
7
8void foo(one_t)
9{
10        sout | "It's a One!";
11}
12
13void foo(int)
14{
15        sout | "It's a Number!";
16}
17
18void testOverloads()
19{
20        foo(0);
21        foo(1);
22        foo(2);
23}
24
25struct S { int i, j; };
26void ?{}( S & s, zero_t ) { s.[i,j] = 0; }                              // constructors
27void ?{}( S & s, one_t ) { s.[i,j] = 1; }
28S ?=?( S & dst, zero_t ) { dst.[i,j] = 0; return dst; } // assignment
29S ?=?( S & dst, one_t ) { dst.[i,j] = 1; return dst; }
30S ?+=?( S & s, one_t ) { s.[i,j] += 1; return s; }              // increment/decrement each field
31S ?-=?( S & s, one_t ) { s.[i,j] -= 1; return s; }
32int ?!=?( S s, zero_t ) { return s.i != 0 && s.j != 0; } // comparison
33void 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
41void 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
98int main() {
99        testOverloads();
100        testInitAssignQueryIncrement();
101        testCompats();
102        return 0;
103}
Note: See TracBrowser for help on using the repository browser.