diff options
| -rw-r--r-- | src/llvm.cff | 26 | ||||
| -rw-r--r-- | src/parse.cff | 2 | ||||
| -rw-r--r-- | test/1.cff | 13 |
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 }}; } @@ -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]); + } } |