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