Skip to content

Commit 73946a8

Browse files
committed
c_gen: fix Decls in while statements
while (Decl* d = init()) .. should become: { Decl* d; while (d = init()) .. }
1 parent 1076a53 commit 73946a8

File tree

2 files changed

+37
-19
lines changed

2 files changed

+37
-19
lines changed

generator/c_generator_stmt.c2

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,21 @@ import string_buffer;
2222
import stdio;
2323
import string;
2424

25+
fn void Generator.emitVarDecl(Generator* gen, VarDecl* vd, string_buffer.Buf* out, bool emit_init) {
26+
Decl* d = cast<Decl*>(vd);
27+
if (vd.hasLocalQualifier()) out.add("static ");
28+
gen.emitTypePre(out, d.getType());
29+
out.space();
30+
out.add(d.getName());
31+
gen.emitTypePost(out, d.getType());
32+
d.setGenerated();
33+
Expr* ie = vd.getInit();
34+
if (ie && emit_init) {
35+
out.add(" = ");
36+
gen.emitExpr(out, ie);
37+
}
38+
}
39+
2540
fn void Generator.emitStmt(Generator* gen, Stmt* s, u32 indent, bool newline) {
2641
string_buffer.Buf* out = gen.out;
2742

@@ -87,14 +102,21 @@ fn void Generator.emitStmt(Generator* gen, Stmt* s, u32 indent, bool newline) {
87102
Stmt* cond = w.getCond();
88103
bool is_decl = cond.isDecl();
89104
if (is_decl) {
90-
// TODO leave out init part
91-
gen.emitStmt(cond, 0, true);
92-
out.indent(indent);
93-
out.add("while (");
105+
out.add("{\n");
106+
indent++;
94107
DeclStmt* ds = cast<DeclStmt*>(cond);
95108
VarDecl* vd = ds.getDecl();
109+
out.indent(indent);
110+
gen.emitVarDecl(vd, out, false);
111+
out.add(";\n");
112+
out.indent(indent);
113+
out.add("while (");
96114
out.add(vd.asDecl().getName());
97-
// TODO also add init part
115+
// add init part
116+
out.add(" = ");
117+
Expr* ie = vd.getInit();
118+
assert(ie);
119+
gen.emitExpr(out, ie);
98120
} else {
99121
out.add("while (");
100122
gen.emitStmt(cond, 0, false);
@@ -106,6 +128,11 @@ fn void Generator.emitStmt(Generator* gen, Stmt* s, u32 indent, bool newline) {
106128
out.add1(';');
107129
}
108130
out.newline();
131+
if (is_decl) {
132+
indent--;
133+
out.indent(indent);
134+
out.add("}\n");
135+
}
109136
break;
110137
case For:
111138
ForStmt* f = cast<ForStmt*>(s);
@@ -174,18 +201,7 @@ fn void Generator.emitStmt(Generator* gen, Stmt* s, u32 indent, bool newline) {
174201
case Decl:
175202
DeclStmt* ds = cast<DeclStmt*>(s);
176203
VarDecl* vd = ds.getDecl();
177-
Decl* d = cast<Decl*>(vd);
178-
if (vd.hasLocalQualifier()) out.add("static ");
179-
gen.emitTypePre(out, d.getType());
180-
out.space();
181-
out.add(d.getName());
182-
gen.emitTypePost(out, d.getType());
183-
d.setGenerated();
184-
Expr* ie = vd.getInit();
185-
if (ie) {
186-
out.add(" = ");
187-
gen.emitExpr(out, ie);
188-
}
204+
gen.emitVarDecl(vd, out, true);
189205
if (newline) out.add(";\n");
190206
break;
191207
case Asm:

test/c_generator/stmts/while_stmt_expr.c2t

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@ int32_t main(int32_t argc, const char** argv)
2929
if ((argc == 2)) break;
3030
}
3131

32-
int32_t b = 10;
33-
while (b) {
32+
{
33+
int32_t b;
34+
while (b = 10) {
35+
}
3436
}
3537

3638
while (true) {

0 commit comments

Comments
 (0)