mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 20:11:17 +00:00
158 lines
5.1 KiB
C
158 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 x = 123;
|
|
int! z = 234;
|
|
int! w;
|
|
int gh = 1;
|
|
if (try x = z && try gh = w)
|
|
{
|
|
printf("Success %d && %d!\n", x, gh);
|
|
}
|
|
if (try x = z + w)
|
|
{
|
|
printf("Test\n");
|
|
}
|
|
anyfault e;
|
|
if (catch e = z)
|
|
{
|
|
printf("Oh noes!\n");
|
|
}
|
|
}
|
|
|
|
/* #expect: try_assign.ll
|
|
|
|
|
|
define void @try_assign.main() #0 {
|
|
entry:
|
|
%x = alloca i32, align 4
|
|
%z = alloca i32, align 4
|
|
%z.f = alloca i64, align 8
|
|
%w = alloca i32, align 4
|
|
%w.f = alloca i64, align 8
|
|
%gh = alloca i32, align 4
|
|
%e = alloca i64, align 8
|
|
store i32 123, ptr %x, align 4
|
|
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 1, ptr %gh, 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
|
|
%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
|
|
%optval8 = load i64, ptr %z.f, align 8
|
|
%not_err9 = icmp eq i64 %optval8, 0
|
|
%7 = call i1 @llvm.expect.i1(i1 %not_err9, i1 true)
|
|
br i1 %7, label %after_check10, label %catch_landing14
|
|
|
|
after_check10: ; preds = %if.exit
|
|
%8 = load i32, ptr %z, align 4
|
|
%optval11 = load i64, ptr %w.f, align 8
|
|
%not_err12 = icmp eq i64 %optval11, 0
|
|
%9 = call i1 @llvm.expect.i1(i1 %not_err12, i1 true)
|
|
br i1 %9, label %after_check13, label %catch_landing14
|
|
|
|
after_check13: ; preds = %after_check10
|
|
%10 = load i32, ptr %w, align 4
|
|
%add = add i32 %8, %10
|
|
store i32 %add, ptr %x, align 4
|
|
br label %phi_try_catch15
|
|
|
|
catch_landing14: ; preds = %after_check10, %if.exit
|
|
br label %phi_try_catch15
|
|
|
|
phi_try_catch15: ; preds = %catch_landing14, %after_check13
|
|
%val16 = phi i1 [ true, %after_check13 ], [ false, %catch_landing14 ]
|
|
br i1 %val16, label %if.then17, label %if.exit18
|
|
|
|
if.then17: ; preds = %phi_try_catch15
|
|
%11 = call i32 (ptr, ...) @printf(ptr @.str.1)
|
|
br label %if.exit18
|
|
|
|
if.exit18: ; preds = %if.then17, %phi_try_catch15
|
|
store i64 0, ptr %e, align 8
|
|
br label %testblock
|
|
|
|
testblock: ; preds = %if.exit18
|
|
%optval19 = load i64, ptr %z.f, align 8
|
|
%not_err20 = icmp eq i64 %optval19, 0
|
|
%12 = call i1 @llvm.expect.i1(i1 %not_err20, i1 true)
|
|
br i1 %12, label %after_check21, label %assign_optional
|
|
|
|
assign_optional: ; preds = %testblock
|
|
store i64 %optval19, ptr %e, align 8
|
|
br label %end_block
|
|
|
|
after_check21: ; preds = %testblock
|
|
store i64 0, ptr %e, align 8
|
|
br label %end_block
|
|
|
|
end_block: ; preds = %after_check21, %assign_optional
|
|
%13 = load i64, ptr %e, align 8
|
|
%neq = icmp ne i64 %13, 0
|
|
br i1 %neq, label %if.then22, label %if.exit23
|
|
|
|
if.then22: ; preds = %end_block
|
|
%14 = call i32 (ptr, ...) @printf(ptr @.str.2)
|
|
br label %if.exit23
|
|
|
|
if.exit23: ; preds = %if.then22, %end_block
|
|
ret void
|
|
}
|
|
|