Files
c3c/test/test_suite/errors/optional_taddr_and_access.c3t
2023-11-13 17:20:46 +01:00

122 lines
4.1 KiB
C

// #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
declare i32 @printf(ptr, ...) #0
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
%0 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 0
%optval = load i64, ptr %z.f, align 8
%not_err = icmp eq i64 %optval, 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 %optval, ptr %w.f, align 8
br label %after_assign
after_check: ; preds = %entry
%2 = load i32, ptr %z, align 4
store i32 %2, ptr %0, align 4
%3 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 1
store i32 0, ptr %3, 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
%4 = call i1 @llvm.expect.i1(i1 %not_err2, i1 true)
br i1 %4, label %after_check3, label %voiderr
after_check3: ; preds = %after_assign
%5 = load ptr, ptr %w, align 8
%6 = getelementptr inbounds %Foo, ptr %5, i32 0, i32 0
%7 = load i32, ptr %6, align 4
%8 = call i32 (ptr, ...) @printf(ptr @.str, i32 %7)
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
%9 = getelementptr inbounds %Foo, ptr %literal5, i32 0, i32 0
%optval6 = load i64, ptr %z.f, align 8
%not_err7 = icmp eq i64 %optval6, 0
%10 = call i1 @llvm.expect.i1(i1 %not_err7, i1 true)
br i1 %10, label %after_check9, label %assign_optional8
assign_optional8: ; preds = %after_check4
store i64 %optval6, ptr %w.f, align 8
br label %after_assign10
after_check9: ; preds = %after_check4
%11 = load i32, ptr %z, align 4
store i32 %11, ptr %9, align 4
%12 = getelementptr inbounds %Foo, ptr %literal5, i32 0, i32 1
store i32 0, ptr %12, align 4
store ptr %literal5, ptr %w, align 8
store i64 0, ptr %w.f, align 8
br label %after_assign10
after_assign10: ; preds = %after_check9, %assign_optional8
%optval11 = load i64, ptr %w.f, align 8
%not_err12 = icmp eq i64 %optval11, 0
%13 = call i1 @llvm.expect.i1(i1 %not_err12, i1 true)
br i1 %13, label %after_check13, label %voiderr14
after_check13: ; preds = %after_assign10
%14 = load ptr, ptr %w, align 8
%15 = getelementptr inbounds %Foo, ptr %14, i32 0, i32 0
%16 = load i32, ptr %15, align 4
%17 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %16)
br label %voiderr14
voiderr14: ; preds = %after_check13, %after_assign10
ret void
}