Files
c3c/test/test_suite/errors/or_and_rethrow.c3t
2023-09-03 10:14:04 +02:00

597 lines
21 KiB
C

// #target: macos-x64
module foo;
import std::io;
fault Foo { ABC }
fn void blurb() { io::printn("Blurb");}
macro int! tester()
{
defer blurb();
return Foo.ABC?;
}
fn void! test(int x)
{
io::printfn("test(%d)", x);
if (x || (tester()!)) io::printn("Ok1");
io::printn("Test next");
if (tester()! || x) io::printn("Ok?");
io::printn("Test ok");
}
fn void! test2(int x)
{
io::printfn("test2(%d)", x);
if (x && (tester()!)) io::printn("Ok1");
io::printn("Test next");
if ((tester()!) && x) io::printn("Ok?");
io::printn("Test ok");
}
fn void main()
{
anyfault a = test(0);
anyfault b = test(1);
anyfault c = test2(0);
anyfault d = test2(1);
}
/* #expect: foo.ll
define i64 @foo.test(i32 %0) #0 {
entry:
%retparam = alloca i64, align 8
%varargslots = alloca [1 x %any], align 16
%taddr = alloca i32, align 4
%error_var = alloca i64, align 8
%blockret = alloca i32, align 4
%len = alloca i64, align 8
%error_var2 = alloca i64, align 8
%retparam4 = alloca i64, align 8
%error_var6 = alloca i64, align 8
%error_var12 = alloca i64, align 8
%len19 = alloca i64, align 8
%error_var20 = alloca i64, align 8
%retparam22 = alloca i64, align 8
%error_var28 = alloca i64, align 8
%error_var34 = alloca i64, align 8
%error_var42 = alloca i64, align 8
%blockret43 = alloca i32, align 4
%len49 = alloca i64, align 8
%error_var50 = alloca i64, align 8
%retparam52 = alloca i64, align 8
%error_var58 = alloca i64, align 8
%error_var64 = alloca i64, align 8
%len74 = alloca i64, align 8
%error_var75 = alloca i64, align 8
%retparam77 = alloca i64, align 8
%error_var83 = alloca i64, align 8
%error_var89 = alloca i64, align 8
store i32 %0, ptr %taddr, align 4
%1 = insertvalue %any undef, ptr %taddr, 0
%2 = insertvalue %any %1, i64 ptrtoint (ptr @"$ct.int" to i64), 1
%3 = getelementptr inbounds [1 x %any], ptr %varargslots, i64 0, i64 0
store %any %2, ptr %3, align 16
%4 = call i64 @std.io.printfn(ptr %retparam, ptr @.str.1, i64 8, ptr %varargslots, i64 1)
%intbool = icmp ne i32 %0, 0
br i1 %intbool, label %or.phi, label %or.rhs
or.rhs: ; preds = %entry
store i64 ptrtoint (ptr @"foo.Foo$ABC" to i64), ptr %error_var, align 8
br label %opt_block_cleanup
opt_block_cleanup: ; preds = %or.rhs
call void @foo.blurb()
br label %guard_block
guard_block: ; preds = %opt_block_cleanup
%5 = load i64, ptr %error_var, align 8
ret i64 %5
or.phi: ; preds = %entry
br label %if.then
if.then: ; preds = %or.phi
%6 = call ptr @std.io.stdout()
%7 = call i64 @std.io.File.write(ptr %retparam4, ptr %6, ptr @.str.2, i64 3)
%not_err = icmp eq i64 %7, 0
%8 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
br i1 %8, label %after_check, label %assign_optional
assign_optional: ; preds = %if.then
store i64 %7, ptr %error_var2, align 8
br label %guard_block5
after_check: ; preds = %if.then
br label %noerr_block
guard_block5: ; preds = %assign_optional
br label %voiderr
noerr_block: ; preds = %after_check
%9 = load i64, ptr %retparam4, align 8
store i64 %9, ptr %len, align 8
%10 = call i64 @std.io.File.write_byte(ptr %6, i8 zeroext 10)
%not_err7 = icmp eq i64 %10, 0
%11 = call i1 @llvm.expect.i1(i1 %not_err7, i1 true)
br i1 %11, label %after_check9, label %assign_optional8
assign_optional8: ; preds = %noerr_block
store i64 %10, ptr %error_var6, align 8
br label %guard_block10
after_check9: ; preds = %noerr_block
br label %noerr_block11
guard_block10: ; preds = %assign_optional8
br label %voiderr
noerr_block11: ; preds = %after_check9
%12 = call i64 @std.io.File.flush(ptr %6)
%not_err13 = icmp eq i64 %12, 0
%13 = call i1 @llvm.expect.i1(i1 %not_err13, i1 true)
br i1 %13, label %after_check15, label %assign_optional14
assign_optional14: ; preds = %noerr_block11
store i64 %12, ptr %error_var12, align 8
br label %guard_block16
after_check15: ; preds = %noerr_block11
br label %noerr_block17
guard_block16: ; preds = %assign_optional14
br label %voiderr
noerr_block17: ; preds = %after_check15
%14 = load i64, ptr %len, align 8
%add = add i64 %14, 1
br label %voiderr
voiderr: ; preds = %noerr_block17, %guard_block16, %guard_block10, %guard_block5
br label %if.exit
if.exit: ; preds = %voiderr
%15 = call ptr @std.io.stdout()
%16 = call i64 @std.io.File.write(ptr %retparam22, ptr %15, ptr @.str.3, i64 9)
%not_err23 = icmp eq i64 %16, 0
%17 = call i1 @llvm.expect.i1(i1 %not_err23, i1 true)
br i1 %17, label %after_check25, label %assign_optional24
assign_optional24: ; preds = %if.exit
store i64 %16, ptr %error_var20, align 8
br label %guard_block26
after_check25: ; preds = %if.exit
br label %noerr_block27
guard_block26: ; preds = %assign_optional24
br label %voiderr41
noerr_block27: ; preds = %after_check25
%18 = load i64, ptr %retparam22, align 8
store i64 %18, ptr %len19, align 8
%19 = call i64 @std.io.File.write_byte(ptr %15, i8 zeroext 10)
%not_err29 = icmp eq i64 %19, 0
%20 = call i1 @llvm.expect.i1(i1 %not_err29, i1 true)
br i1 %20, label %after_check31, label %assign_optional30
assign_optional30: ; preds = %noerr_block27
store i64 %19, ptr %error_var28, align 8
br label %guard_block32
after_check31: ; preds = %noerr_block27
br label %noerr_block33
guard_block32: ; preds = %assign_optional30
br label %voiderr41
noerr_block33: ; preds = %after_check31
%21 = call i64 @std.io.File.flush(ptr %15)
%not_err35 = icmp eq i64 %21, 0
%22 = call i1 @llvm.expect.i1(i1 %not_err35, i1 true)
br i1 %22, label %after_check37, label %assign_optional36
assign_optional36: ; preds = %noerr_block33
store i64 %21, ptr %error_var34, align 8
br label %guard_block38
after_check37: ; preds = %noerr_block33
br label %noerr_block39
guard_block38: ; preds = %assign_optional36
br label %voiderr41
noerr_block39: ; preds = %after_check37
%23 = load i64, ptr %len19, align 8
%add40 = add i64 %23, 1
br label %voiderr41
voiderr41: ; preds = %noerr_block39, %guard_block38, %guard_block32, %guard_block26
store i64 ptrtoint (ptr @"foo.Foo$ABC" to i64), ptr %error_var42, align 8
br label %opt_block_cleanup44
opt_block_cleanup44: ; preds = %voiderr41
call void @foo.blurb()
br label %guard_block45
guard_block45: ; preds = %opt_block_cleanup44
%24 = load i64, ptr %error_var42, align 8
ret i64 %24
if.then47: ; No predecessors!
%25 = call ptr @std.io.stdout()
%26 = call i64 @std.io.File.write(ptr %retparam52, ptr %25, ptr @.str.4, i64 3)
%not_err53 = icmp eq i64 %26, 0
%27 = call i1 @llvm.expect.i1(i1 %not_err53, i1 true)
br i1 %27, label %after_check55, label %assign_optional54
assign_optional54: ; preds = %if.then47
store i64 %26, ptr %error_var50, align 8
br label %guard_block56
after_check55: ; preds = %if.then47
br label %noerr_block57
guard_block56: ; preds = %assign_optional54
br label %voiderr71
noerr_block57: ; preds = %after_check55
%28 = load i64, ptr %retparam52, align 8
store i64 %28, ptr %len49, align 8
%29 = call i64 @std.io.File.write_byte(ptr %25, i8 zeroext 10)
%not_err59 = icmp eq i64 %29, 0
%30 = call i1 @llvm.expect.i1(i1 %not_err59, i1 true)
br i1 %30, label %after_check61, label %assign_optional60
assign_optional60: ; preds = %noerr_block57
store i64 %29, ptr %error_var58, align 8
br label %guard_block62
after_check61: ; preds = %noerr_block57
br label %noerr_block63
guard_block62: ; preds = %assign_optional60
br label %voiderr71
noerr_block63: ; preds = %after_check61
%31 = call i64 @std.io.File.flush(ptr %25)
%not_err65 = icmp eq i64 %31, 0
%32 = call i1 @llvm.expect.i1(i1 %not_err65, i1 true)
br i1 %32, label %after_check67, label %assign_optional66
assign_optional66: ; preds = %noerr_block63
store i64 %31, ptr %error_var64, align 8
br label %guard_block68
after_check67: ; preds = %noerr_block63
br label %noerr_block69
guard_block68: ; preds = %assign_optional66
br label %voiderr71
noerr_block69: ; preds = %after_check67
%33 = load i64, ptr %len49, align 8
%add70 = add i64 %33, 1
br label %voiderr71
voiderr71: ; preds = %noerr_block69, %guard_block68, %guard_block62, %guard_block56
br label %if.exit72
if.exit72: ; preds = %voiderr71
%34 = call ptr @std.io.stdout()
%35 = call i64 @std.io.File.write(ptr %retparam77, ptr %34, ptr @.str.5, i64 7)
%not_err78 = icmp eq i64 %35, 0
%36 = call i1 @llvm.expect.i1(i1 %not_err78, i1 true)
br i1 %36, label %after_check80, label %assign_optional79
assign_optional79: ; preds = %if.exit72
store i64 %35, ptr %error_var75, align 8
br label %guard_block81
after_check80: ; preds = %if.exit72
br label %noerr_block82
guard_block81: ; preds = %assign_optional79
br label %voiderr96
noerr_block82: ; preds = %after_check80
%37 = load i64, ptr %retparam77, align 8
store i64 %37, ptr %len74, align 8
%38 = call i64 @std.io.File.write_byte(ptr %34, i8 zeroext 10)
%not_err84 = icmp eq i64 %38, 0
%39 = call i1 @llvm.expect.i1(i1 %not_err84, i1 true)
br i1 %39, label %after_check86, label %assign_optional85
assign_optional85: ; preds = %noerr_block82
store i64 %38, ptr %error_var83, align 8
br label %guard_block87
after_check86: ; preds = %noerr_block82
br label %noerr_block88
guard_block87: ; preds = %assign_optional85
br label %voiderr96
noerr_block88: ; preds = %after_check86
%40 = call i64 @std.io.File.flush(ptr %34)
%not_err90 = icmp eq i64 %40, 0
%41 = call i1 @llvm.expect.i1(i1 %not_err90, i1 true)
br i1 %41, label %after_check92, label %assign_optional91
assign_optional91: ; preds = %noerr_block88
store i64 %40, ptr %error_var89, align 8
br label %guard_block93
after_check92: ; preds = %noerr_block88
br label %noerr_block94
guard_block93: ; preds = %assign_optional91
br label %voiderr96
noerr_block94: ; preds = %after_check92
%42 = load i64, ptr %len74, align 8
%add95 = add i64 %42, 1
br label %voiderr96
voiderr96: ; preds = %noerr_block94, %guard_block93, %guard_block87, %guard_block81
ret i64 0
}
; Function Attrs: nounwind
define i64 @foo.test2(i32 %0) #0 {
entry:
%retparam = alloca i64, align 8
%varargslots = alloca [1 x %any], align 16
%taddr = alloca i32, align 4
%error_var = alloca i64, align 8
%blockret = alloca i32, align 4
%len = alloca i64, align 8
%error_var2 = alloca i64, align 8
%retparam4 = alloca i64, align 8
%error_var6 = alloca i64, align 8
%error_var12 = alloca i64, align 8
%error_var18 = alloca i64, align 8
%blockret19 = alloca i32, align 4
%len25 = alloca i64, align 8
%error_var26 = alloca i64, align 8
%retparam28 = alloca i64, align 8
%error_var34 = alloca i64, align 8
%error_var40 = alloca i64, align 8
store i32 %0, ptr %taddr, align 4
%1 = insertvalue %any undef, ptr %taddr, 0
%2 = insertvalue %any %1, i64 ptrtoint (ptr @"$ct.int" to i64), 1
%3 = getelementptr inbounds [1 x %any], ptr %varargslots, i64 0, i64 0
store %any %2, ptr %3, align 16
%4 = call i64 @std.io.printfn(ptr %retparam, ptr @.str.6, i64 9, ptr %varargslots, i64 1)
%intbool = icmp ne i32 %0, 0
br i1 %intbool, label %and.rhs, label %and.phi
and.rhs: ; preds = %entry
store i64 ptrtoint (ptr @"foo.Foo$ABC" to i64), ptr %error_var, align 8
br label %opt_block_cleanup
opt_block_cleanup: ; preds = %and.rhs
call void @foo.blurb()
br label %guard_block
guard_block: ; preds = %opt_block_cleanup
%5 = load i64, ptr %error_var, align 8
ret i64 %5
and.phi: ; preds = %entry
br label %if.exit
if.exit: ; preds = %and.phi
%6 = call ptr @std.io.stdout()
%7 = call i64 @std.io.File.write(ptr %retparam4, ptr %6, ptr @.str.7, i64 9)
%not_err = icmp eq i64 %7, 0
%8 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
br i1 %8, label %after_check, label %assign_optional
assign_optional: ; preds = %if.exit
store i64 %7, ptr %error_var2, align 8
br label %guard_block5
after_check: ; preds = %if.exit
br label %noerr_block
guard_block5: ; preds = %assign_optional
br label %voiderr
noerr_block: ; preds = %after_check
%9 = load i64, ptr %retparam4, align 8
store i64 %9, ptr %len, align 8
%10 = call i64 @std.io.File.write_byte(ptr %6, i8 zeroext 10)
%not_err7 = icmp eq i64 %10, 0
%11 = call i1 @llvm.expect.i1(i1 %not_err7, i1 true)
br i1 %11, label %after_check9, label %assign_optional8
assign_optional8: ; preds = %noerr_block
store i64 %10, ptr %error_var6, align 8
br label %guard_block10
after_check9: ; preds = %noerr_block
br label %noerr_block11
guard_block10: ; preds = %assign_optional8
br label %voiderr
noerr_block11: ; preds = %after_check9
%12 = call i64 @std.io.File.flush(ptr %6)
%not_err13 = icmp eq i64 %12, 0
%13 = call i1 @llvm.expect.i1(i1 %not_err13, i1 true)
br i1 %13, label %after_check15, label %assign_optional14
assign_optional14: ; preds = %noerr_block11
store i64 %12, ptr %error_var12, align 8
br label %guard_block16
after_check15: ; preds = %noerr_block11
br label %noerr_block17
guard_block16: ; preds = %assign_optional14
br label %voiderr
noerr_block17: ; preds = %after_check15
%14 = load i64, ptr %len, align 8
%add = add i64 %14, 1
br label %voiderr
voiderr: ; preds = %noerr_block17, %guard_block16, %guard_block10, %guard_block5
store i64 ptrtoint (ptr @"foo.Foo$ABC" to i64), ptr %error_var18, align 8
br label %opt_block_cleanup20
opt_block_cleanup20: ; preds = %voiderr
call void @foo.blurb()
br label %guard_block21
guard_block21: ; preds = %opt_block_cleanup20
%15 = load i64, ptr %error_var18, align 8
ret i64 %15
if.exit23: ; No predecessors!
%16 = call ptr @std.io.stdout()
%17 = call i64 @std.io.File.write(ptr %retparam28, ptr %16, ptr @.str.8, i64 7)
%not_err29 = icmp eq i64 %17, 0
%18 = call i1 @llvm.expect.i1(i1 %not_err29, i1 true)
br i1 %18, label %after_check31, label %assign_optional30
assign_optional30: ; preds = %if.exit23
store i64 %17, ptr %error_var26, align 8
br label %guard_block32
after_check31: ; preds = %if.exit23
br label %noerr_block33
guard_block32: ; preds = %assign_optional30
br label %voiderr47
noerr_block33: ; preds = %after_check31
%19 = load i64, ptr %retparam28, align 8
store i64 %19, ptr %len25, align 8
%20 = call i64 @std.io.File.write_byte(ptr %16, i8 zeroext 10)
%not_err35 = icmp eq i64 %20, 0
%21 = call i1 @llvm.expect.i1(i1 %not_err35, i1 true)
br i1 %21, label %after_check37, label %assign_optional36
assign_optional36: ; preds = %noerr_block33
store i64 %20, ptr %error_var34, align 8
br label %guard_block38
after_check37: ; preds = %noerr_block33
br label %noerr_block39
guard_block38: ; preds = %assign_optional36
br label %voiderr47
noerr_block39: ; preds = %after_check37
%22 = call i64 @std.io.File.flush(ptr %16)
%not_err41 = icmp eq i64 %22, 0
%23 = call i1 @llvm.expect.i1(i1 %not_err41, i1 true)
br i1 %23, label %after_check43, label %assign_optional42
assign_optional42: ; preds = %noerr_block39
store i64 %22, ptr %error_var40, align 8
br label %guard_block44
after_check43: ; preds = %noerr_block39
br label %noerr_block45
guard_block44: ; preds = %assign_optional42
br label %voiderr47
noerr_block45: ; preds = %after_check43
%24 = load i64, ptr %len25, align 8
%add46 = add i64 %24, 1
br label %voiderr47
voiderr47: ; preds = %noerr_block45, %guard_block44, %guard_block38, %guard_block32
ret i64 0
}
; Function Attrs: nounwind
define void @foo.main() #0 {
entry:
%a = alloca i64, align 8
%error_var = alloca i64, align 8
%b = alloca i64, align 8
%error_var1 = alloca i64, align 8
%c = alloca i64, align 8
%error_var6 = alloca i64, align 8
%d = alloca i64, align 8
%error_var11 = alloca i64, align 8
store i64 0, ptr %error_var, align 8
%0 = call i64 @foo.test(i32 0)
%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 = %entry
store i64 %0, ptr %error_var, align 8
br label %noerr_block
after_check: ; preds = %entry
br label %noerr_block
noerr_block: ; preds = %after_check, %assign_optional
%2 = load i64, ptr %error_var, align 8
store i64 %2, ptr %a, align 8
store i64 0, ptr %error_var1, align 8
%3 = call i64 @foo.test(i32 1)
%not_err2 = icmp eq i64 %3, 0
%4 = call i1 @llvm.expect.i1(i1 %not_err2, i1 true)
br i1 %4, label %after_check4, label %assign_optional3
assign_optional3: ; preds = %noerr_block
store i64 %3, ptr %error_var1, align 8
br label %noerr_block5
after_check4: ; preds = %noerr_block
br label %noerr_block5
noerr_block5: ; preds = %after_check4, %assign_optional3
%5 = load i64, ptr %error_var1, align 8
store i64 %5, ptr %b, align 8
store i64 0, ptr %error_var6, align 8
%6 = call i64 @foo.test2(i32 0)
%not_err7 = icmp eq i64 %6, 0
%7 = call i1 @llvm.expect.i1(i1 %not_err7, i1 true)
br i1 %7, label %after_check9, label %assign_optional8
assign_optional8: ; preds = %noerr_block5
store i64 %6, ptr %error_var6, align 8
br label %noerr_block10
after_check9: ; preds = %noerr_block5
br label %noerr_block10
noerr_block10: ; preds = %after_check9, %assign_optional8
%8 = load i64, ptr %error_var6, align 8
store i64 %8, ptr %c, align 8
store i64 0, ptr %error_var11, align 8
%9 = call i64 @foo.test2(i32 1)
%not_err12 = icmp eq i64 %9, 0
%10 = call i1 @llvm.expect.i1(i1 %not_err12, i1 true)
br i1 %10, label %after_check14, label %assign_optional13
assign_optional13: ; preds = %noerr_block10
store i64 %9, ptr %error_var11, align 8
br label %noerr_block15
after_check14: ; preds = %noerr_block10
br label %noerr_block15
noerr_block15: ; preds = %after_check14, %assign_optional13
%11 = load i64, ptr %error_var11, align 8
store i64 %11, ptr %d, align 8
ret void
}
; Function Attrs: nounwind
define i32 @main(i32 %0, ptr %1) #0 {
entry:
call void @foo.main()
ret i32 0
}