Files
c3c/test/test_suite/errors/optional_taddr_and_access.c3t
Christoffer Lerno 5c77c9a754 - Change distinct -> typedef.
- Order of attribute declaration is changed for `alias`.
- Added `LANGUAGE_DEV_VERSION` env constant.
- Rename `anyfault` -> `fault`.
- Changed `fault` -> `faultdef`.
- Added `attrdef` instead of `alias` for attribute aliases.
2025-03-15 20:10:47 +01:00

114 lines
3.7 KiB
Plaintext

// #target: macos-x64
module test;
struct Foo
{
int x, y;
}
faultdef 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 = 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 9, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8
@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1
@test.FOO = linkonce constant %"char[]" { ptr @test.FOO.nameof, i64 9 }, align 8
@test.FOO.nameof = internal constant [10 x i8] c"test::FOO\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.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
}