Skip to content

Commit a0d69a4

Browse files
committed
fix(compiler): fix autocasting augment assignment always using =
1 parent 5b5f323 commit a0d69a4

File tree

6 files changed

+188
-2
lines changed

6 files changed

+188
-2
lines changed

compiler/src/compiler/compiler.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ void compiler::perform_assign(std::pair<std::string, ykobject> &lhs,
7474
(lhs.second.datatype_->const_unwrap()->is_a_number() ||
7575
lhs.second.datatype_->const_unwrap()->is_bool())) {
7676
// Number cast that we can do here
77-
body_ << lhs.first << " = ";
77+
body_ << lhs.first << operator_token->token_;
7878
cast_numbers(castable, lhs, rhs);
7979
if (lhs.second.is_primitive_or_obj() &&
8080
lhs.second.datatype_->const_unwrap()->is_f32() &&

compiler/src/compiler/type_checker.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1144,7 +1144,7 @@ void type_checker::visit_cfor_stmt(cfor_stmt *obj) {
11441144
obj->comparison_->accept(this);
11451145
auto comp = pop();
11461146
if (!comp.datatype_->const_unwrap()->is_bool()) {
1147-
error(obj->semi1_, "Comparision must be a boolean operation");
1147+
error(obj->semi1_, "Comparison must be a boolean operation");
11481148
}
11491149
}
11501150
if (obj->operation_ != nullptr) { obj->operation_->accept(this); }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
def main() -> int:
2+
a = 0
3+
b = True
4+
for (x = 0; x < 10; x = x + 1):
5+
a += b
6+
println(a)
7+
0
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
[
2+
["output.c",0,1,"//","INT_DIV"],
3+
["output.c",0,4,"YK","NAME"],
4+
["output.c",0,6,"\n","NEW_LINE"],
5+
["output.c",1,1,"include \"yk__lib.h\"","COMMENT"],
6+
["output.c",1,21,"\n","NEW_LINE"],
7+
["output.c",2,1,"//","INT_DIV"],
8+
["output.c",2,4,"-","SUB"],
9+
["output.c",2,5,"-","SUB"],
10+
["output.c",2,6,"forward","NAME"],
11+
["output.c",2,14,"declarations","NAME"],
12+
["output.c",2,26,"-","SUB"],
13+
["output.c",2,27,"-","SUB"],
14+
["output.c",2,29,"\n","NEW_LINE"],
15+
["output.c",3,1,"int32_t","NAME"],
16+
["output.c",3,9,"yy__main","NAME"],
17+
["output.c",3,17,"(","PAREN_OPEN"],
18+
["output.c",3,18,")","PAREN_CLOSE"],
19+
["output.c",3,19,";","SEMICOLON"],
20+
["output.c",3,20,"\n","NEW_LINE"],
21+
["output.c",4,1,"//","INT_DIV"],
22+
["output.c",4,4,"-","SUB"],
23+
["output.c",4,5,"-","SUB"],
24+
["output.c",4,6,"structs","NAME"],
25+
["output.c",4,13,"-","SUB"],
26+
["output.c",4,14,"-","SUB"],
27+
["output.c",4,16,"\n","NEW_LINE"],
28+
["output.c",5,1,"//","INT_DIV"],
29+
["output.c",5,4,"-","SUB"],
30+
["output.c",5,5,"-","SUB"],
31+
["output.c",5,6,"functions","NAME"],
32+
["output.c",5,15,"-","SUB"],
33+
["output.c",5,16,"-","SUB"],
34+
["output.c",5,18,"\n","NEW_LINE"],
35+
["output.c",6,1,"int32_t","NAME"],
36+
["output.c",6,9,"yy__main","NAME"],
37+
["output.c",6,17,"(","PAREN_OPEN"],
38+
["output.c",6,18,")","PAREN_CLOSE"],
39+
["output.c",6,20,"\n","NEW_LINE"],
40+
["output.c",7,1,"{","CURLY_BRACKET_OPEN"],
41+
["output.c",7,2,"\n","NEW_LINE"],
42+
["output.c",8,1," ","INDENT"],
43+
["output.c",8,5,"int32_t","NAME"],
44+
["output.c",8,13,"yy__a","NAME"],
45+
["output.c",8,19,"=","EQ"],
46+
["output.c",8,21,"INT32_C","NAME"],
47+
["output.c",8,28,"(","PAREN_OPEN"],
48+
["output.c",8,29,"0","INTEGER_DECIMAL"],
49+
["output.c",8,30,")","PAREN_CLOSE"],
50+
["output.c",8,31,";","SEMICOLON"],
51+
["output.c",8,32,"\n","NEW_LINE"],
52+
["output.c",9,1," ","INDENT"],
53+
["output.c",9,5,"bool","NAME"],
54+
["output.c",9,10,"yy__b","NAME"],
55+
["output.c",9,16,"=","EQ"],
56+
["output.c",9,18,"true","NAME"],
57+
["output.c",9,22,";","SEMICOLON"],
58+
["output.c",9,23,"\n","NEW_LINE"],
59+
["output.c",10,1," ","INDENT"],
60+
["output.c",10,5,"for","KEYWORD_FOR"],
61+
["output.c",10,9,"(","PAREN_OPEN"],
62+
["output.c",10,10,"int32_t","NAME"],
63+
["output.c",10,18,"yy__x","NAME"],
64+
["output.c",10,24,"=","EQ"],
65+
["output.c",10,26,"INT32_C","NAME"],
66+
["output.c",10,33,"(","PAREN_OPEN"],
67+
["output.c",10,34,"0","INTEGER_DECIMAL"],
68+
["output.c",10,35,")","PAREN_CLOSE"],
69+
["output.c",10,36,";","SEMICOLON"],
70+
["output.c",10,37,"(","PAREN_OPEN"],
71+
["output.c",10,38,"yy__x","NAME"],
72+
["output.c",10,44,"<","LESS"],
73+
["output.c",10,46,"INT32_C","NAME"],
74+
["output.c",10,53,"(","PAREN_OPEN"],
75+
["output.c",10,54,"10","INTEGER_DECIMAL"],
76+
["output.c",10,56,")","PAREN_CLOSE"],
77+
["output.c",10,57,")","PAREN_CLOSE"],
78+
["output.c",10,58,";","SEMICOLON"],
79+
["output.c",10,59,"yy__x","NAME"],
80+
["output.c",10,65,"=","EQ"],
81+
["output.c",10,67,"(","PAREN_OPEN"],
82+
["output.c",10,68,"yy__x","NAME"],
83+
["output.c",10,74,"+","PLUS"],
84+
["output.c",10,76,"INT32_C","NAME"],
85+
["output.c",10,83,"(","PAREN_OPEN"],
86+
["output.c",10,84,"1","INTEGER_DECIMAL"],
87+
["output.c",10,85,")","PAREN_CLOSE"],
88+
["output.c",10,86,")","PAREN_CLOSE"],
89+
["output.c",10,87,")","PAREN_CLOSE"],
90+
["output.c",10,88,"\n","NEW_LINE"],
91+
["output.c",11,1," ","INDENT"],
92+
["output.c",11,5,"{","CURLY_BRACKET_OPEN"],
93+
["output.c",11,6,"\n","NEW_LINE"],
94+
["output.c",12,1," ","INDENT"],
95+
["output.c",12,9,"yy__a","NAME"],
96+
["output.c",12,14,"+=","PLUS_EQ"],
97+
["output.c",12,16,"(","PAREN_OPEN"],
98+
["output.c",12,17,"(","PAREN_OPEN"],
99+
["output.c",12,18,"int32_t","NAME"],
100+
["output.c",12,25,")","PAREN_CLOSE"],
101+
["output.c",12,26,"(","PAREN_OPEN"],
102+
["output.c",12,27,"(","PAREN_OPEN"],
103+
["output.c",12,28,"(","PAREN_OPEN"],
104+
["output.c",12,29,"yy__b","NAME"],
105+
["output.c",12,34,")","PAREN_CLOSE"],
106+
["output.c",12,38,"1","INTEGER_DECIMAL"],
107+
["output.c",12,40,":","COLON"],
108+
["output.c",12,42,"0","INTEGER_DECIMAL"],
109+
["output.c",12,43,")","PAREN_CLOSE"],
110+
["output.c",12,44,")","PAREN_CLOSE"],
111+
["output.c",12,45,")","PAREN_CLOSE"],
112+
["output.c",12,46,";","SEMICOLON"],
113+
["output.c",12,47,"\n","NEW_LINE"],
114+
["output.c",13,1," ","INDENT"],
115+
["output.c",13,5,"}","CURLY_BRACKET_CLOSE"],
116+
["output.c",13,6,"\n","NEW_LINE"],
117+
["output.c",14,1," ","INDENT"],
118+
["output.c",14,5,"yk__printlnint","NAME"],
119+
["output.c",14,19,"(","PAREN_OPEN"],
120+
["output.c",14,20,"(","PAREN_OPEN"],
121+
["output.c",14,21,"intmax_t","NAME"],
122+
["output.c",14,29,")","PAREN_CLOSE"],
123+
["output.c",14,30,"yy__a","NAME"],
124+
["output.c",14,35,")","PAREN_CLOSE"],
125+
["output.c",14,36,";","SEMICOLON"],
126+
["output.c",14,37,"\n","NEW_LINE"],
127+
["output.c",15,1," ","INDENT"],
128+
["output.c",15,5,"return","KEYWORD_RETURN"],
129+
["output.c",15,12,"INT32_C","NAME"],
130+
["output.c",15,19,"(","PAREN_OPEN"],
131+
["output.c",15,20,"0","INTEGER_DECIMAL"],
132+
["output.c",15,21,")","PAREN_CLOSE"],
133+
["output.c",15,22,";","SEMICOLON"],
134+
["output.c",15,23,"\n","NEW_LINE"],
135+
["output.c",16,1,"}","CURLY_BRACKET_CLOSE"],
136+
["output.c",16,2,"\n","NEW_LINE"],
137+
["output.c",17,1,"if defined(YK__MINIMAL_MAIN)","COMMENT"],
138+
["output.c",17,30,"\n","NEW_LINE"],
139+
["output.c",18,1,"int","NAME"],
140+
["output.c",18,5,"main","NAME"],
141+
["output.c",18,9,"(","PAREN_OPEN"],
142+
["output.c",18,10,"void","NAME"],
143+
["output.c",18,14,")","PAREN_CLOSE"],
144+
["output.c",18,16,"{","CURLY_BRACKET_OPEN"],
145+
["output.c",18,18,"return","KEYWORD_RETURN"],
146+
["output.c",18,25,"yy__main","NAME"],
147+
["output.c",18,33,"(","PAREN_OPEN"],
148+
["output.c",18,34,")","PAREN_CLOSE"],
149+
["output.c",18,35,";","SEMICOLON"],
150+
["output.c",18,37,"}","CURLY_BRACKET_CLOSE"],
151+
["output.c",18,38,"\n","NEW_LINE"],
152+
["output.c",19,1,"endif","COMMENT"],
153+
["output.c",19,8,"","END_OF_FILE"]
154+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// YK
2+
#include "yk__lib.h"
3+
// --forward declarations--
4+
int32_t yy__main();
5+
// --structs--
6+
// --functions--
7+
int32_t yy__main()
8+
{
9+
int32_t yy__a = INT32_C(0);
10+
bool yy__b = true;
11+
for (int32_t yy__x = INT32_C(0);(yy__x < INT32_C(10));yy__x = (yy__x + INT32_C(1)))
12+
{
13+
yy__a+=((int32_t)(((yy__b) ? 1 : 0)));
14+
}
15+
yk__printlnint((intmax_t)yy__a);
16+
return INT32_C(0);
17+
}
18+
#if defined(YK__MINIMAL_MAIN)
19+
int main(void) { return yy__main(); }
20+
#endif

compiler/tests/test_compiler.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -478,3 +478,8 @@ TEST_CASE("compiler: c like for loop") {
478478
"../test_data/compiler_tests/for_loop_test.yaka", "for_loop_test.yaka",
479479
"../test_data/compiler_tests/output/for_loop_test.tokens");
480480
}
481+
TEST_CASE("compiler: auto cast bool count") {
482+
test_compile_yaka_file(
483+
"../test_data/compiler_tests/auto_casting/autocastboolcount.yaka", "autocastboolcount.yaka",
484+
"../test_data/compiler_tests/output/autocastboolcount.tokens");
485+
}

0 commit comments

Comments
 (0)