Files
c3c/test/test_suite/errors/multiple_catch.c3t

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
}