Files
c3c/test/test_suite/errors/try_assign.c3t
Christoffer Lerno 60945ffe58 Fix of tests.
2024-08-05 19:52:34 +02:00

155 lines
5.1 KiB
C

// #target: macos-x64
extern fn int! err();
fault FooErr { QBERT }
extern fn int printf(char* fmt, ...);
fn void main()
{
int! z = 234;
int! w;
if (try x = z && try gh = w)
{
printf("Success %d && %d!\n", x, gh);
}
if (try x = z + w)
{
printf("Test\n");
}
if (catch e = z)
{
printf("Oh noes!\n");
}
}
/* #expect: try_assign.ll
define void @try_assign.main() #0 {
entry:
%z = alloca i32, align 4
%z.f = alloca i64, align 8
%w = alloca i32, align 4
%w.f = alloca i64, align 8
%x = alloca i32, align 4
%gh = alloca i32, align 4
%x8 = alloca i32, align 4
%e = alloca i64, align 8
store i32 234, ptr %z, align 4
store i64 0, ptr %z.f, align 8
store i64 0, ptr %w.f, align 8
store i32 0, ptr %w, align 4
store i32 0, ptr %x, align 4
%optval = load i64, ptr %z.f, align 8
%not_err = icmp eq i64 %optval, 0
%0 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
br i1 %0, label %after_check, label %catch_landing
after_check: ; preds = %entry
%1 = load i32, ptr %z, align 4
store i32 %1, ptr %x, align 4
br label %phi_try_catch
catch_landing: ; preds = %entry
br label %phi_try_catch
phi_try_catch: ; preds = %catch_landing, %after_check
%val = phi i1 [ true, %after_check ], [ false, %catch_landing ]
br i1 %val, label %chain_next, label %fail_chain
chain_next: ; preds = %phi_try_catch
store i32 0, ptr %gh, align 4
%optval1 = load i64, ptr %w.f, align 8
%not_err2 = icmp eq i64 %optval1, 0
%2 = call i1 @llvm.expect.i1(i1 %not_err2, i1 true)
br i1 %2, label %after_check3, label %catch_landing4
after_check3: ; preds = %chain_next
%3 = load i32, ptr %w, align 4
store i32 %3, ptr %gh, align 4
br label %phi_try_catch5
catch_landing4: ; preds = %chain_next
br label %phi_try_catch5
phi_try_catch5: ; preds = %catch_landing4, %after_check3
%val6 = phi i1 [ true, %after_check3 ], [ false, %catch_landing4 ]
br i1 %val6, label %chain_next7, label %fail_chain
chain_next7: ; preds = %phi_try_catch5
br label %end_chain
fail_chain: ; preds = %phi_try_catch5, %phi_try_catch
br label %end_chain
end_chain: ; preds = %fail_chain, %chain_next7
%chain.phi = phi i1 [ true, %chain_next7 ], [ false, %fail_chain ]
br i1 %chain.phi, label %if.then, label %if.exit
if.then: ; preds = %end_chain
%4 = load i32, ptr %x, align 4
%5 = load i32, ptr %gh, align 4
%6 = call i32 (ptr, ...) @printf(ptr @.str, i32 %4, i32 %5)
br label %if.exit
if.exit: ; preds = %if.then, %end_chain
store i32 0, ptr %x8, align 4
%optval9 = load i64, ptr %z.f, align 8
%not_err10 = icmp eq i64 %optval9, 0
%7 = call i1 @llvm.expect.i1(i1 %not_err10, i1 true)
br i1 %7, label %after_check11, label %catch_landing15
after_check11: ; preds = %if.exit
%8 = load i32, ptr %z, align 4
%optval12 = load i64, ptr %w.f, align 8
%not_err13 = icmp eq i64 %optval12, 0
%9 = call i1 @llvm.expect.i1(i1 %not_err13, i1 true)
br i1 %9, label %after_check14, label %catch_landing15
after_check14: ; preds = %after_check11
%10 = load i32, ptr %w, align 4
%add = add i32 %8, %10
store i32 %add, ptr %x8, align 4
br label %phi_try_catch16
catch_landing15: ; preds = %after_check11, %if.exit
br label %phi_try_catch16
phi_try_catch16: ; preds = %catch_landing15, %after_check14
%val17 = phi i1 [ true, %after_check14 ], [ false, %catch_landing15 ]
br i1 %val17, label %if.then18, label %if.exit19
if.then18: ; preds = %phi_try_catch16
%11 = call i32 (ptr, ...) @printf(ptr @.str.1)
br label %if.exit19
if.exit19: ; preds = %if.then18, %phi_try_catch16
br label %testblock
testblock: ; preds = %if.exit19
%optval20 = load i64, ptr %z.f, align 8
%not_err21 = icmp eq i64 %optval20, 0
%12 = call i1 @llvm.expect.i1(i1 %not_err21, i1 true)
br i1 %12, label %after_check22, label %assign_optional
assign_optional: ; preds = %testblock
store i64 %optval20, ptr %e, align 8
br label %end_block
after_check22: ; preds = %testblock
store i64 0, ptr %e, align 8
br label %end_block
end_block: ; preds = %after_check22, %assign_optional
%13 = load i64, ptr %e, align 8
%neq = icmp ne i64 %13, 0
br i1 %neq, label %if.then23, label %if.exit24
if.then23: ; preds = %end_block
%14 = call i32 (ptr, ...) @printf(ptr @.str.2)
br label %if.exit24
if.exit24: ; preds = %if.then23, %end_block
ret void
}