aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-25 10:38:08 +0200
committerlemon <lsof@mailbox.org>2022-08-25 10:38:08 +0200
commit128c854f4ecb5f158cce3d91bb266ab000f27d4b (patch)
tree3cf34279e1d325f3f5a83a5524fe3c23462f3b98
parentc511c1a189cf0df60487c286caced0b251104859 (diff)
add cond switch
-rw-r--r--src/llvm.cff26
-rw-r--r--src/parse.cff2
-rw-r--r--test/1.cff13
3 files changed, 39 insertions, 2 deletions
diff --git a/src/llvm.cff b/src/llvm.cff
index b0111fe..81fe056 100644
--- a/src/llvm.cff
+++ b/src/llvm.cff
@@ -954,6 +954,32 @@ fn genstmt(f *Fn, block *Block, st *Stmt) void {
gen("\tbr label %%ESe%d\n", id);
gen("ESe%d: ", id);
nop();
+
+ case CSwitch *sw;
+ static swid int = {};
+ let id = swid++;
+
+
+ if sw.cs.#len == 0 {
+ gen("\tbr label %%CSx%d\n", id);
+ }
+ foreach (c, i, sw.cs) {
+ let t = llvmbool(f, &c.test);
+ gen("\tbr i1 %v, label %%CST%d.%d, label %%CSF%d.%d\n", t, id, i, id, i);
+ gen("CST%d.%d: ", id, i);
+ genblock(f, c.t);
+ gen("\tbr label %%CSe%d\n", id);
+ gen("CSF%d.%d: ", id, i);
+ if i == sw.cs.#len - 1 {
+ gen("\tbr label %%CSx%d\n", id);
+ }
+ }
+ gen("CSx%d: ", id);
+ genblock(f, sw.f);
+ gen("\tbr label %%CSe%d\n", id);
+ gen("CSe%d: ", id);
+ nop();
+
case else
assert(#f, "stmt? %d", st.u.#tag);
diff --git a/src/parse.cff b/src/parse.cff
index 2ac15ba..dc3cad3 100644
--- a/src/parse.cff
+++ b/src/parse.cff
@@ -2309,9 +2309,9 @@ fn pstcswitch(P *Parser, loc Loc) Stmt {
c.test = parseexpr(P);
lexexpect(P, ';');
c.t = parseblock0(P);
+ cs->push(c);
}
-
return { loc, :CSwitch { cs->move(P.alloc), f }};
}
diff --git a/test/1.cff b/test/1.cff
index cdda6b9..3854aa8 100644
--- a/test/1.cff
+++ b/test/1.cff
@@ -1,6 +1,6 @@
import "libc.hff";
-extern fn main(argc int) int {
+extern fn main(argc int, argv **u8) int {
switch argc - 1 {
case 0, 1;
printf("zero or one\n");
@@ -14,4 +14,15 @@ extern fn main(argc int) int {
case else
printf("its %d\n", argc);
}
+
+ switch {
+ case argv[1] != #null and strcmp(argv[1], "hello") == 0;
+ printf("world\n");
+
+ case argv[1] != #null and strcmp(argv[1], "42") == 0;
+ printf("forty two\n");
+
+ case else
+ printf("- %s\n", argv[1]);
+ }
}