mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
118 lines
3.9 KiB
Plaintext
118 lines
3.9 KiB
Plaintext
// #target: macos-x64
|
|
|
|
module test;
|
|
struct Foo
|
|
{
|
|
int x, y;
|
|
}
|
|
|
|
fault MyErr
|
|
{
|
|
FOO
|
|
}
|
|
|
|
extern fn int printf(char *c, ...);
|
|
|
|
fn void main()
|
|
{
|
|
int! z = 2;
|
|
Foo*! w = &&(Foo){ z, 0 };
|
|
(void)printf("%d\n", w.x);
|
|
z = MyErr.FOO?;
|
|
w = &&(Foo){ z, 0 };
|
|
(void)printf("Not visible: %d\n", w.x);
|
|
}
|
|
|
|
/* #expect: test.ll
|
|
|
|
%Foo = type { i32, i32 }
|
|
|
|
@"$ct.test.Foo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8
|
|
@"test.MyErr$FOO" = linkonce constant %.fault { i64 ptrtoint (ptr @"$ct.test.MyErr" to i64), %"char[]" { ptr @.fault, i64 3 }, i64 1 }, align 8
|
|
@.fault = internal constant [4 x i8] c"FOO\00", align 1
|
|
@"$ct.test.MyErr" = linkonce global %.introspect { i8 9, i64 0, ptr null, i64 8, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8
|
|
@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1
|
|
@.str.1 = private unnamed_addr constant [17 x i8] c"Not visible: %d\0A\00", align 1
|
|
|
|
; Function Attrs:
|
|
declare i32 @printf(ptr, ...) #0
|
|
|
|
; Function Attrs:
|
|
define void @test.main() #0 {
|
|
entry:
|
|
%z = alloca i32, align 4
|
|
%z.f = alloca i64, align 8
|
|
%w = alloca ptr, align 8
|
|
%w.f = alloca i64, align 8
|
|
%literal = alloca %Foo, align 4
|
|
%literal5 = alloca %Foo, align 4
|
|
store i32 2, ptr %z, align 4
|
|
store i64 0, ptr %z.f, align 8
|
|
%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 %assign_optional
|
|
|
|
assign_optional: ; preds = %entry
|
|
store i64 %optval, ptr %w.f, align 8
|
|
br label %after_assign
|
|
|
|
after_check: ; preds = %entry
|
|
%1 = load i32, ptr %z, align 4
|
|
store i32 %1, ptr %literal, align 4
|
|
%ptradd = getelementptr inbounds i8, ptr %literal, i64 4
|
|
store i32 0, ptr %ptradd, align 4
|
|
store ptr %literal, ptr %w, align 8
|
|
store i64 0, ptr %w.f, align 8
|
|
br label %after_assign
|
|
|
|
after_assign: ; preds = %after_check, %assign_optional
|
|
%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 %voiderr
|
|
|
|
after_check3: ; preds = %after_assign
|
|
%3 = load ptr, ptr %w, align 8
|
|
%4 = load i32, ptr %3, align 4
|
|
%5 = call i32 (ptr, ...) @printf(ptr @.str, i32 %4)
|
|
br label %voiderr
|
|
|
|
voiderr: ; preds = %after_check3, %after_assign
|
|
store i64 ptrtoint (ptr @"test.MyErr$FOO" to i64), ptr %z.f, align 8
|
|
br label %after_check4
|
|
|
|
after_check4: ; preds = %voiderr
|
|
%optval6 = load i64, ptr %z.f, align 8
|
|
%not_err7 = icmp eq i64 %optval6, 0
|
|
%6 = call i1 @llvm.expect.i1(i1 %not_err7, i1 true)
|
|
br i1 %6, label %after_check9, label %assign_optional8
|
|
|
|
assign_optional8: ; preds = %after_check4
|
|
store i64 %optval6, ptr %w.f, align 8
|
|
br label %after_assign11
|
|
|
|
after_check9: ; preds = %after_check4
|
|
%7 = load i32, ptr %z, align 4
|
|
store i32 %7, ptr %literal5, align 4
|
|
%ptradd10 = getelementptr inbounds i8, ptr %literal5, i64 4
|
|
store i32 0, ptr %ptradd10, align 4
|
|
store ptr %literal5, ptr %w, align 8
|
|
store i64 0, ptr %w.f, align 8
|
|
br label %after_assign11
|
|
|
|
after_assign11: ; preds = %after_check9, %assign_optional8
|
|
%optval12 = load i64, ptr %w.f, align 8
|
|
%not_err13 = icmp eq i64 %optval12, 0
|
|
%8 = call i1 @llvm.expect.i1(i1 %not_err13, i1 true)
|
|
br i1 %8, label %after_check14, label %voiderr15
|
|
|
|
after_check14: ; preds = %after_assign11
|
|
%9 = load ptr, ptr %w, align 8
|
|
%10 = load i32, ptr %9, align 4
|
|
%11 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %10)
|
|
br label %voiderr15
|
|
|
|
voiderr15: ; preds = %after_check14, %after_assign11
|
|
ret void
|
|
} |