mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 20:11:17 +00:00
241 lines
8.3 KiB
C
241 lines
8.3 KiB
C
// #target: macos-x64
|
|
|
|
module demo1;
|
|
import std::io;
|
|
|
|
fault CheckError
|
|
{
|
|
ABC,
|
|
DEF
|
|
}
|
|
|
|
fn int! hello(int a)
|
|
{
|
|
io::printn("hello");
|
|
return a < 0 ? CheckError.ABC? : a;
|
|
}
|
|
|
|
fn void! bye()
|
|
{
|
|
io::printn("bye");
|
|
return CheckError.DEF?;
|
|
}
|
|
fn void main()
|
|
{
|
|
if (catch err = hello(-1), bye())
|
|
{
|
|
io::printfn("1 Got %s", err);
|
|
}
|
|
if (catch err = hello(0), bye())
|
|
{
|
|
io::printfn("2 Got %s", err);
|
|
}
|
|
if (catch hello(0), bye())
|
|
{
|
|
io::printn("3 Ok");
|
|
}
|
|
if (catch anyfault err = hello(0), bye())
|
|
{
|
|
io::printfn("4 Got %s", err);
|
|
}
|
|
}
|
|
|
|
/* #expect: demo1.ll
|
|
|
|
define void @demo1.main() #0 {
|
|
entry:
|
|
%err = alloca i64, align 8
|
|
%retparam = alloca i32, align 4
|
|
%retparam5 = alloca i64, align 8
|
|
%varargslots = alloca [1 x %any], align 16
|
|
%err8 = alloca i64, align 8
|
|
%retparam10 = alloca i32, align 4
|
|
%retparam21 = alloca i64, align 8
|
|
%varargslots22 = alloca [1 x %any], align 16
|
|
%temp_err = alloca i64, align 8
|
|
%retparam27 = alloca i32, align 4
|
|
%x = alloca %"char[]", align 8
|
|
%retparam38 = alloca i64, align 8
|
|
%result = alloca %File, align 8
|
|
%err42 = alloca i64, align 8
|
|
%retparam44 = alloca i32, align 4
|
|
%retparam55 = alloca i64, align 8
|
|
%varargslots56 = alloca [1 x %any], align 16
|
|
br label %testblock
|
|
|
|
testblock: ; preds = %entry
|
|
%0 = call i64 @demo1.hello(ptr %retparam, i32 -1)
|
|
%not_err = icmp eq i64 %0, 0
|
|
%1 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
|
|
br i1 %1, label %after_check, label %assign_optional
|
|
|
|
assign_optional: ; preds = %testblock
|
|
store i64 %0, ptr %err, align 8
|
|
br label %end_block
|
|
|
|
after_check: ; preds = %testblock
|
|
br label %testblock1
|
|
|
|
testblock1: ; preds = %after_check
|
|
%2 = call i64 @demo1.bye()
|
|
%not_err2 = icmp eq i64 %2, 0
|
|
%3 = call i1 @llvm.expect.i1(i1 %not_err2, i1 true)
|
|
br i1 %3, label %after_check4, label %assign_optional3
|
|
|
|
assign_optional3: ; preds = %testblock1
|
|
store i64 %2, ptr %err, align 8
|
|
br label %end_block
|
|
|
|
after_check4: ; preds = %testblock1
|
|
store i64 0, ptr %err, align 8
|
|
br label %end_block
|
|
|
|
end_block: ; preds = %after_check4, %assign_optional3, %assign_optional
|
|
%4 = load i64, ptr %err, align 8
|
|
%neq = icmp ne i64 %4, 0
|
|
br i1 %neq, label %if.then, label %if.exit
|
|
|
|
if.then: ; preds = %end_block
|
|
%5 = insertvalue %any undef, ptr %err, 0
|
|
%6 = insertvalue %any %5, i64 ptrtoint (ptr @"$ct.anyfault" to i64), 1
|
|
%7 = getelementptr inbounds [1 x %any], ptr %varargslots, i64 0, i64 0
|
|
store %any %6, ptr %7, align 16
|
|
%8 = call i64 @std.io.printfn(ptr %retparam5, ptr @.str.3, i64 8, ptr %varargslots, i64 1)
|
|
br label %if.exit
|
|
|
|
if.exit: ; preds = %if.then, %end_block
|
|
br label %testblock9
|
|
|
|
testblock9: ; preds = %if.exit
|
|
%9 = call i64 @demo1.hello(ptr %retparam10, i32 0)
|
|
%not_err11 = icmp eq i64 %9, 0
|
|
%10 = call i1 @llvm.expect.i1(i1 %not_err11, i1 true)
|
|
br i1 %10, label %after_check13, label %assign_optional12
|
|
|
|
assign_optional12: ; preds = %testblock9
|
|
store i64 %9, ptr %err8, align 8
|
|
br label %end_block18
|
|
|
|
after_check13: ; preds = %testblock9
|
|
br label %testblock14
|
|
|
|
testblock14: ; preds = %after_check13
|
|
%11 = call i64 @demo1.bye()
|
|
%not_err15 = icmp eq i64 %11, 0
|
|
%12 = call i1 @llvm.expect.i1(i1 %not_err15, i1 true)
|
|
br i1 %12, label %after_check17, label %assign_optional16
|
|
|
|
assign_optional16: ; preds = %testblock14
|
|
store i64 %11, ptr %err8, align 8
|
|
br label %end_block18
|
|
|
|
after_check17: ; preds = %testblock14
|
|
store i64 0, ptr %err8, align 8
|
|
br label %end_block18
|
|
|
|
end_block18: ; preds = %after_check17, %assign_optional16, %assign_optional12
|
|
%13 = load i64, ptr %err8, align 8
|
|
%neq19 = icmp ne i64 %13, 0
|
|
br i1 %neq19, label %if.then20, label %if.exit25
|
|
|
|
if.then20: ; preds = %end_block18
|
|
%14 = insertvalue %any undef, ptr %err8, 0
|
|
%15 = insertvalue %any %14, i64 ptrtoint (ptr @"$ct.anyfault" to i64), 1
|
|
%16 = getelementptr inbounds [1 x %any], ptr %varargslots22, i64 0, i64 0
|
|
store %any %15, ptr %16, align 16
|
|
%17 = call i64 @std.io.printfn(ptr %retparam21, ptr @.str.4, i64 8, ptr %varargslots22, i64 1)
|
|
br label %if.exit25
|
|
|
|
if.exit25: ; preds = %if.then20, %end_block18
|
|
br label %testblock26
|
|
|
|
testblock26: ; preds = %if.exit25
|
|
%18 = call i64 @demo1.hello(ptr %retparam27, i32 0)
|
|
%not_err28 = icmp eq i64 %18, 0
|
|
%19 = call i1 @llvm.expect.i1(i1 %not_err28, i1 true)
|
|
br i1 %19, label %after_check30, label %assign_optional29
|
|
|
|
assign_optional29: ; preds = %testblock26
|
|
store i64 %18, ptr %temp_err, align 8
|
|
br label %end_block35
|
|
|
|
after_check30: ; preds = %testblock26
|
|
br label %testblock31
|
|
|
|
testblock31: ; preds = %after_check30
|
|
%20 = call i64 @demo1.bye()
|
|
%not_err32 = icmp eq i64 %20, 0
|
|
%21 = call i1 @llvm.expect.i1(i1 %not_err32, i1 true)
|
|
br i1 %21, label %after_check34, label %assign_optional33
|
|
|
|
assign_optional33: ; preds = %testblock31
|
|
store i64 %20, ptr %temp_err, align 8
|
|
br label %end_block35
|
|
|
|
after_check34: ; preds = %testblock31
|
|
store i64 0, ptr %temp_err, align 8
|
|
br label %end_block35
|
|
|
|
end_block35: ; preds = %after_check34, %assign_optional33, %assign_optional29
|
|
%22 = load i64, ptr %temp_err, align 8
|
|
%neq36 = icmp ne i64 %22, 0
|
|
br i1 %neq36, label %if.then37, label %if.exit41
|
|
|
|
if.then37: ; preds = %end_block35
|
|
store %"char[]" { ptr @.str.5, i64 4 }, ptr %x, align 8
|
|
%23 = call ptr @std.io.stdout()
|
|
store ptr %23, ptr %result, align 8
|
|
%24 = load ptr, ptr %result, align 8
|
|
%25 = getelementptr inbounds %"char[]", ptr %x, i32 0, i32 0
|
|
%lo = load ptr, ptr %25, align 8
|
|
%26 = getelementptr inbounds %"char[]", ptr %x, i32 0, i32 1
|
|
%hi = load i64, ptr %26, align 8
|
|
%27 = call i64 @std.io.File.printn(ptr %retparam38, ptr %24, ptr %lo, i64 %hi)
|
|
br label %if.exit41
|
|
|
|
if.exit41: ; preds = %if.then37, %end_block35
|
|
br label %testblock43
|
|
|
|
testblock43: ; preds = %if.exit41
|
|
%28 = call i64 @demo1.hello(ptr %retparam44, i32 0)
|
|
%not_err45 = icmp eq i64 %28, 0
|
|
%29 = call i1 @llvm.expect.i1(i1 %not_err45, i1 true)
|
|
br i1 %29, label %after_check47, label %assign_optional46
|
|
|
|
assign_optional46: ; preds = %testblock43
|
|
store i64 %28, ptr %err42, align 8
|
|
br label %end_block52
|
|
|
|
after_check47: ; preds = %testblock43
|
|
br label %testblock48
|
|
|
|
testblock48: ; preds = %after_check47
|
|
%30 = call i64 @demo1.bye()
|
|
%not_err49 = icmp eq i64 %30, 0
|
|
%31 = call i1 @llvm.expect.i1(i1 %not_err49, i1 true)
|
|
br i1 %31, label %after_check51, label %assign_optional50
|
|
|
|
assign_optional50: ; preds = %testblock48
|
|
store i64 %30, ptr %err42, align 8
|
|
br label %end_block52
|
|
|
|
after_check51: ; preds = %testblock48
|
|
store i64 0, ptr %err42, align 8
|
|
br label %end_block52
|
|
|
|
end_block52: ; preds = %after_check51, %assign_optional50, %assign_optional46
|
|
%32 = load i64, ptr %err42, align 8
|
|
%neq53 = icmp ne i64 %32, 0
|
|
br i1 %neq53, label %if.then54, label %if.exit59
|
|
|
|
if.then54: ; preds = %end_block52
|
|
%33 = insertvalue %any undef, ptr %err42, 0
|
|
%34 = insertvalue %any %33, i64 ptrtoint (ptr @"$ct.anyfault" to i64), 1
|
|
%35 = getelementptr inbounds [1 x %any], ptr %varargslots56, i64 0, i64 0
|
|
store %any %34, ptr %35, align 16
|
|
%36 = call i64 @std.io.printfn(ptr %retparam55, ptr @.str.6, i64 8, ptr %varargslots56, i64 1)
|
|
br label %if.exit59
|
|
|
|
if.exit59: ; preds = %if.then54, %end_block52
|
|
ret void
|
|
}
|