1 #include <pa/exprs.h>
2 #include "tests.h"
3 
4 #include <iostream>
5 
main()6 int main()
7 {
8 	int ret = 0;
9 	pa::Expr s0 = pa::ExprSym(0);
10 	pa::Expr s1 = pa::ExprSym(1);
11 	pa::Expr s2 = pa::ExprSym(2);
12 	{
13 		pa::Expr expr(pa::ExprImm(true) + pa::ExprImm(true));
14 		ret |= check_imm(expr, false);
15 	}
16 
17 	{
18 		pa::Expr a0(pa::ExprImm(true));
19 		pa::Expr a1(pa::ExprImm(false));
20 
21 		pa::Expr expr = a0+a1;
22 		ret |= check_imm(expr, true);
23 	}
24 
25 	{
26 		pa::Expr a0(pa::ExprImm(true));
27 		pa::Expr a1(pa::ExprImm(false));
28 
29 		a0 += a1;
30 		ret |= check_imm(a0, true);
31 	}
32 
33 	{
34 		pa::Expr expr = pa::ExprImm(true) + pa::ExprImm(true);
35 		ret |= check_imm(expr, false);
36 	}
37 
38 	{
39 		pa::Expr expr = pa::ExprSym(0) + pa::ExprImm(true);
40 		printf("%s\n", expr.name());
41 	}
42 
43 	{
44 		pa::Expr expr = pa::ExprSym(0) + pa::ExprSym(0);
45 		ret |= check_imm(expr, false);
46 	}
47 
48 	{
49 		pa::Expr e0 = pa::ExprAdd({pa::ExprSym(0), pa::ExprSym(1)});
50 		pa::Expr e1 = pa::ExprAdd({pa::ExprSym(2), pa::ExprSym(3)});
51 		pa::Expr expr = e0 + e1;
52 		ret |= expr.call_assert([](pa::ExprAdd const& e)
53 				{
54 					const size_t nargs = e.args().size();
55 					std::cout << "nargs: " << nargs << std::endl;
56 					if (nargs != 4) {
57 						std::cerr << "error: got " << nargs << ", expected 4!" << std::endl;
58 						return 1;
59 					}
60 					return 0;
61 				});
62 	}
63 
64 	{
65 		pa::Expr e0 = pa::ExprAdd({pa::ExprSym(0), pa::ExprSym(1)}) + pa::ExprImm(1);
66 		ret |= check_type<pa::ExprAdd>(e0);
67 		if (e0.nargs() != 3) {
68 			std::cerr << "error: expected 3 args, got " << e0.nargs() << std::endl;
69 			ret = 1;
70 		}
71 	}
72 
73 	{
74 		pa::Expr e0 = pa::ExprAdd({pa::ExprSym(0), pa::ExprSym(1)}) + pa::ExprMul({pa::ExprSym(0), pa::ExprSym(1)});
75 		ret |= check_type<pa::ExprAdd>(e0);
76 		if (e0.nargs() != 3) {
77 			std::cerr << "error: expected 3 args, got " << e0.nargs() << std::endl;
78 			ret = 1;
79 		}
80 	}
81 
82 	{
83 		pa::Expr e0 = s0;
84 		pa::Expr e1 = s0;
85 		e0 += e1;
86 		ret |= check_imm(e0, false);
87 	}
88 
89 	{
90 		pa::Expr e0 = s0;
91 		pa::Expr e1 = s1;
92 		e0 += e1;
93 		ret |= check_type<pa::ExprAdd>(e0);
94 	}
95 
96 	{
97 		pa::Expr e0 = s0;
98 		pa::Expr e1 = s1;
99 		e0 += e1;
100 		ret |= check_type<pa::ExprAdd>(e0);
101 	}
102 
103 	{
104 		pa::Expr e0 = s0 + s1;
105 		e0 += e0;
106 		ret |= check_imm(e0, 0);
107 	}
108 
109 	pa::Expr esf0 = pa::ExprESF{2, {s0, s1, s2}};
110 	{
111 		pa::Expr e0 = s0+s1;
112 		e0 += esf0;
113 	}
114 	{
115 		pa::Expr e0 = s0|s1;
116 		e0 += esf0;
117 	}
118 	{
119 		pa::Expr e0 = s0*s1;
120 		e0 += esf0;
121 	}
122 
123 	return ret;
124 }
125