mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 20:11:17 +00:00
- Order of attribute declaration is changed for `alias`. - Added `LANGUAGE_DEV_VERSION` env constant. - Rename `anyfault` -> `fault`. - Changed `fault` -> `faultdef`. - Added `attrdef` instead of `alias` for attribute aliases.
119 lines
3.0 KiB
Plaintext
119 lines
3.0 KiB
Plaintext
// #target: macos-x64
|
|
module test;
|
|
import std::io;
|
|
|
|
faultdef BAD_STUFF, WORSE_STUFF, THE_WORST_STUFF;
|
|
|
|
fn int exitcode(fault error)
|
|
{
|
|
switch (error)
|
|
{
|
|
case BAD_STUFF: return 64;
|
|
case WORSE_STUFF: return 65;
|
|
case THE_WORST_STUFF: return 66;
|
|
default: return 70;
|
|
}
|
|
}
|
|
|
|
fn void? canFail()
|
|
{
|
|
if (34 + 35 == 69)
|
|
{
|
|
return BAD_STUFF?;
|
|
}
|
|
}
|
|
|
|
fn int main(String[] args)
|
|
{
|
|
if (catch err = canFail())
|
|
{
|
|
return exitcode(err);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* #expect: test.ll
|
|
|
|
|
|
define i32 @test.exitcode(i64 %0) #0 {
|
|
entry:
|
|
%switch = alloca i64, align 8
|
|
store i64 %0, ptr %switch, align 8
|
|
br label %switch.entry
|
|
|
|
switch.entry: ; preds = %entry
|
|
%1 = load i64, ptr %switch, align 8
|
|
%eq = icmp eq i64 ptrtoint (ptr @test.BAD_STUFF to i64), %1
|
|
br i1 %eq, label %switch.case, label %next_if
|
|
|
|
switch.case: ; preds = %switch.entry
|
|
ret i32 64
|
|
|
|
next_if: ; preds = %switch.entry
|
|
%eq1 = icmp eq i64 ptrtoint (ptr @test.WORSE_STUFF to i64), %1
|
|
br i1 %eq1, label %switch.case2, label %next_if3
|
|
|
|
switch.case2: ; preds = %next_if
|
|
ret i32 65
|
|
|
|
next_if3: ; preds = %next_if
|
|
%eq4 = icmp eq i64 ptrtoint (ptr @test.THE_WORST_STUFF to i64), %1
|
|
br i1 %eq4, label %switch.case5, label %next_if6
|
|
|
|
switch.case5: ; preds = %next_if3
|
|
ret i32 66
|
|
|
|
next_if6: ; preds = %next_if3
|
|
br label %switch.default
|
|
|
|
switch.default: ; preds = %next_if6
|
|
ret i32 70
|
|
}
|
|
|
|
define i64 @test.canFail() #0 {
|
|
entry:
|
|
br label %if.then
|
|
|
|
if.then: ; preds = %entry
|
|
ret i64 ptrtoint (ptr @test.BAD_STUFF to i64)
|
|
}
|
|
|
|
define i32 @test.main(ptr %0, i64 %1) #0 {
|
|
entry:
|
|
%args = alloca %"char[][]", align 8
|
|
%err = alloca i64, align 8
|
|
store ptr %0, ptr %args, align 8
|
|
%ptradd = getelementptr inbounds i8, ptr %args, i64 8
|
|
store i64 %1, ptr %ptradd, align 8
|
|
br label %testblock
|
|
|
|
testblock: ; preds = %entry
|
|
%2 = call i64 @test.canFail()
|
|
%not_err = icmp eq i64 %2, 0
|
|
%3 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
|
|
br i1 %3, label %after_check, label %assign_optional
|
|
|
|
assign_optional: ; preds = %testblock
|
|
store i64 %2, ptr %err, align 8
|
|
br label %end_block
|
|
|
|
after_check: ; preds = %testblock
|
|
store i64 0, ptr %err, align 8
|
|
br label %end_block
|
|
|
|
end_block: ; preds = %after_check, %assign_optional
|
|
%4 = load i64, ptr %err, align 8
|
|
%i2b = icmp ne i64 %4, 0
|
|
br i1 %i2b, label %if.then, label %if.exit
|
|
|
|
if.then: ; preds = %end_block
|
|
%5 = load i64, ptr %err, align 8
|
|
%6 = call i32 @test.exitcode(i64 %5)
|
|
ret i32 %6
|
|
|
|
if.exit: ; preds = %end_block
|
|
ret i32 0
|
|
}
|
|
|