Files
c3c/test/test_suite/errors/general_error_regression.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

242 lines
7.2 KiB
Plaintext

// #target: macos-x64
module foo;
import std::io;
import libc;
faultdef
X,
Y,
Z,
W,
W1;
faultdef X1, Y2;
typedef Bar = int;
enum MyEnum
{
A,
B
}
fn void Bar.hello(Bar *b)
{
io::printn("Hello from Bar");
}
fn void MyEnum.hello(MyEnum *myenum)
{
io::printn("Hello from MyEnum");
}
fn void main()
{
fault f = X;
fault ef = Y;
fault x = f;
ulong z = (ulong)(x);
libc::printf("1: %p\n", z);
x = ef;
z = (ulong)(x);
libc::printf("2: %p\n", z);
x = W;
z = (ulong)(x);
libc::printf("21: %p\n", z);
x = W1;
z = (ulong)(x);
libc::printf("22: %p\n", z);
x = X1;
z = (ulong)(x);
libc::printf("3: %p\n", z);
x = Y2;
z = (ulong)(x);
libc::printf("4: %p\n", z);
Bar b;
MyEnum a = MyEnum.A;
b.hello();
a.hello();
}
/* #expect: foo.ll
define void @foo.Bar.hello(ptr %0) #0 {
entry:
%len = alloca i64, align 8
%error_var = alloca i64, align 8
%retparam = alloca i64, align 8
%error_var2 = alloca i64, align 8
%error_var8 = alloca i64, align 8
%1 = call ptr @std.io.stdout()
%2 = call i64 @std.io.File.write(ptr %retparam, ptr %1, ptr @.str.6, i64 14)
%not_err = icmp eq i64 %2, 0
%3 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
br i1 %3, label %after_check, label %assign_optional
assign_optional: ; preds = %entry
store i64 %2, ptr %error_var, align 8
br label %guard_block
after_check: ; preds = %entry
br label %noerr_block
guard_block: ; preds = %assign_optional
br label %voiderr
noerr_block: ; preds = %after_check
%4 = load i64, ptr %retparam, align 8
store i64 %4, ptr %len, align 8
%5 = call i64 @std.io.File.write_byte(ptr %1, i8 zeroext 10)
%not_err3 = icmp eq i64 %5, 0
%6 = call i1 @llvm.expect.i1(i1 %not_err3, i1 true)
br i1 %6, label %after_check5, label %assign_optional4
assign_optional4: ; preds = %noerr_block
store i64 %5, ptr %error_var2, align 8
br label %guard_block6
after_check5: ; preds = %noerr_block
br label %noerr_block7
guard_block6: ; preds = %assign_optional4
br label %voiderr
noerr_block7: ; preds = %after_check5
%7 = call i64 @std.io.File.flush(ptr %1)
%not_err9 = icmp eq i64 %7, 0
%8 = call i1 @llvm.expect.i1(i1 %not_err9, i1 true)
br i1 %8, label %after_check11, label %assign_optional10
assign_optional10: ; preds = %noerr_block7
store i64 %7, ptr %error_var8, align 8
br label %guard_block12
after_check11: ; preds = %noerr_block7
br label %noerr_block13
guard_block12: ; preds = %assign_optional10
br label %voiderr
noerr_block13: ; preds = %after_check11
%9 = load i64, ptr %len, align 8
%add = add i64 %9, 1
br label %voiderr
voiderr: ; preds = %noerr_block13, %guard_block12, %guard_block6, %guard_block
ret void
}
define void @foo.MyEnum.hello(ptr %0) #0 {
entry:
%len = alloca i64, align 8
%error_var = alloca i64, align 8
%retparam = alloca i64, align 8
%error_var2 = alloca i64, align 8
%error_var8 = alloca i64, align 8
%1 = call ptr @std.io.stdout()
%2 = call i64 @std.io.File.write(ptr %retparam, ptr %1, ptr @.str.7, i64 17)
%not_err = icmp eq i64 %2, 0
%3 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
br i1 %3, label %after_check, label %assign_optional
assign_optional: ; preds = %entry
store i64 %2, ptr %error_var, align 8
br label %guard_block
after_check: ; preds = %entry
br label %noerr_block
guard_block: ; preds = %assign_optional
br label %voiderr
noerr_block: ; preds = %after_check
%4 = load i64, ptr %retparam, align 8
store i64 %4, ptr %len, align 8
%5 = call i64 @std.io.File.write_byte(ptr %1, i8 zeroext 10)
%not_err3 = icmp eq i64 %5, 0
%6 = call i1 @llvm.expect.i1(i1 %not_err3, i1 true)
br i1 %6, label %after_check5, label %assign_optional4
assign_optional4: ; preds = %noerr_block
store i64 %5, ptr %error_var2, align 8
br label %guard_block6
after_check5: ; preds = %noerr_block
br label %noerr_block7
guard_block6: ; preds = %assign_optional4
br label %voiderr
noerr_block7: ; preds = %after_check5
%7 = call i64 @std.io.File.flush(ptr %1)
%not_err9 = icmp eq i64 %7, 0
%8 = call i1 @llvm.expect.i1(i1 %not_err9, i1 true)
br i1 %8, label %after_check11, label %assign_optional10
assign_optional10: ; preds = %noerr_block7
store i64 %7, ptr %error_var8, align 8
br label %guard_block12
after_check11: ; preds = %noerr_block7
br label %noerr_block13
guard_block12: ; preds = %assign_optional10
br label %voiderr
noerr_block13: ; preds = %after_check11
%9 = load i64, ptr %len, align 8
%add = add i64 %9, 1
br label %voiderr
voiderr: ; preds = %noerr_block13, %guard_block12, %guard_block6, %guard_block
ret void
}
define void @foo.main() #0 {
entry:
%f = alloca i64, align 8
%ef = alloca i64, align 8
%x = alloca i64, align 8
%z = alloca i64, align 8
%b = alloca i32, align 4
%a = alloca i32, align 4
store i64 ptrtoint (ptr @foo.X to i64), ptr %f, align 8
store i64 ptrtoint (ptr @foo.Y to i64), ptr %ef, align 8
%0 = load i64, ptr %f, align 8
store i64 %0, ptr %x, align 8
%1 = load i64, ptr %x, align 8
store i64 %1, ptr %z, align 8
%2 = load i64, ptr %z, align 8
%3 = call i32 (ptr, ...) @printf(ptr @.str, i64 %2)
%4 = load i64, ptr %ef, align 8
store i64 %4, ptr %x, align 8
%5 = load i64, ptr %x, align 8
store i64 %5, ptr %z, align 8
%6 = load i64, ptr %z, align 8
%7 = call i32 (ptr, ...) @printf(ptr @.str.1, i64 %6)
store i64 ptrtoint (ptr @foo.W to i64), ptr %x, align 8
%8 = load i64, ptr %x, align 8
store i64 %8, ptr %z, align 8
%9 = load i64, ptr %z, align 8
%10 = call i32 (ptr, ...) @printf(ptr @.str.2, i64 %9)
store i64 ptrtoint (ptr @foo.W1 to i64), ptr %x, align 8
%11 = load i64, ptr %x, align 8
store i64 %11, ptr %z, align 8
%12 = load i64, ptr %z, align 8
%13 = call i32 (ptr, ...) @printf(ptr @.str.3, i64 %12)
store i64 ptrtoint (ptr @foo.X1 to i64), ptr %x, align 8
%14 = load i64, ptr %x, align 8
store i64 %14, ptr %z, align 8
%15 = load i64, ptr %z, align 8
%16 = call i32 (ptr, ...) @printf(ptr @.str.4, i64 %15)
store i64 ptrtoint (ptr @foo.Y2 to i64), ptr %x, align 8
%17 = load i64, ptr %x, align 8
store i64 %17, ptr %z, align 8
%18 = load i64, ptr %z, align 8
%19 = call i32 (ptr, ...) @printf(ptr @.str.5, i64 %18)
store i32 0, ptr %b, align 4
store i32 0, ptr %a, align 4
call void @foo.Bar.hello(ptr %b)
call void @foo.MyEnum.hello(ptr %a)
ret void
}