Files
c3c/test/test_suite/macros/unifying_implicit_void.c3t
2025-08-23 22:31:29 +02:00

129 lines
4.2 KiB
Plaintext

// #target: macos-x64
module oups;
import std::io;
fn void main()
{
ByteReader r;
InStream s = &r;
s.foo()!!;
}
macro InStream.foo(&self)
{
char? c = self.read_byte();
if (catch err = c)
{
return err?;
}
return;
}
/* #expect: oups.ll
define void @oups.main() #0 {
entry:
%r = alloca %ByteReader, align 8
%s = alloca %any, align 8
%error_var = alloca i64, align 8
%c = alloca i8, align 1
%c.f = alloca i64, align 8
%.inlinecache = alloca ptr, align 8
%.cachedtype = alloca ptr, align 8
%retparam = alloca i8, align 1
%err = alloca i64, align 8
%varargslots = alloca [1 x %any], align 16
%indirectarg = alloca %"any[]", align 8
store ptr null, ptr %.cachedtype, align 8
call void @llvm.memset.p0.i64(ptr align 8 %r, i8 0, i64 24, i1 false)
%0 = insertvalue %any undef, ptr %r, 0
%1 = insertvalue %any %0, i64 ptrtoint (ptr @"$ct.std.io.ByteReader" to i64), 1
store %any %1, ptr %s, align 8
%ptradd = getelementptr inbounds i8, ptr %s, i64 8
%2 = load i64, ptr %ptradd, align 8
%3 = inttoptr i64 %2 to ptr
%type = load ptr, ptr %.cachedtype, align 8
%4 = icmp eq ptr %3, %type
br i1 %4, label %cache_hit, label %cache_miss
cache_miss: ; preds = %entry
%5 = call ptr @.dyn_search(ptr %3, ptr @"$sel.read_byte")
store ptr %5, ptr %.inlinecache, align 8
store ptr %3, ptr %.cachedtype, align 8
br label %6
cache_hit: ; preds = %entry
%cache_hit_fn = load ptr, ptr %.inlinecache, align 8
br label %6
6: ; preds = %cache_hit, %cache_miss
%fn_phi = phi ptr [ %cache_hit_fn, %cache_hit ], [ %5, %cache_miss ]
%7 = icmp eq ptr %fn_phi, null
br i1 %7, label %missing_function, label %match
missing_function: ; preds = %6
%8 = load ptr, ptr @std.core.builtin.panic, align 8
call void %8(ptr @.panic_msg, i64 46, ptr @.file, i64 25, ptr @.func, i64 4, i32 13) #4
unreachable
match: ; preds = %6
%9 = load ptr, ptr %s, align 8
%10 = call i64 %fn_phi(ptr %retparam, ptr %9)
%not_err = icmp eq i64 %10, 0
%11 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
br i1 %11, label %after_check, label %assign_optional
assign_optional: ; preds = %match
store i64 %10, ptr %c.f, align 8
br label %after_assign
after_check: ; preds = %match
%12 = load i8, ptr %retparam, align 1
store i8 %12, ptr %c, align 1
store i64 0, ptr %c.f, align 8
br label %after_assign
after_assign: ; preds = %after_check, %assign_optional
br label %testblock
testblock: ; preds = %after_assign
%optval = load i64, ptr %c.f, align 8
%not_err1 = icmp eq i64 %optval, 0
%13 = call i1 @llvm.expect.i1(i1 %not_err1, i1 true)
br i1 %13, label %after_check3, label %assign_optional2
assign_optional2: ; preds = %testblock
store i64 %optval, ptr %err, align 8
br label %end_block
after_check3: ; preds = %testblock
store i64 0, ptr %err, align 8
br label %end_block
end_block: ; preds = %after_check3, %assign_optional2
%14 = load i64, ptr %err, align 8
%i2b = icmp ne i64 %14, 0
br i1 %i2b, label %if.then, label %if.exit
if.then: ; preds = %end_block
%15 = load i64, ptr %err, align 8
store i64 %15, ptr %error_var, align 8
br label %panic_block
if.exit: ; preds = %end_block
br label %noerr_block
panic_block: ; preds = %if.then
%16 = insertvalue %any undef, ptr %error_var, 0
%17 = insertvalue %any %16, i64 ptrtoint (ptr @"$ct.fault" to i64), 1
store %any %17, ptr %varargslots, align 16
%18 = insertvalue %"any[]" undef, ptr %varargslots, 0
%"$$temp" = insertvalue %"any[]" %18, i64 1, 1
store %"any[]" %"$$temp", ptr %indirectarg, align 8
call void @std.core.builtin.panicf(ptr @.panic_msg.1, i64 36,
unreachable
noerr_block: ; preds = %if.exit
ret void
}