Files
c3c/test/test_suite/lambda/nested_lambda_def.c3t

82 lines
1.5 KiB
C

// #target: macos-x64
module abc;
import bar;
import std::io;
fn int xy(Callback a) => a();
fn void main()
{
const Callback F = bar::get_callback();
int z = xy(F);
z = xy(F);
io::printfn("val: %d", z);
}
module foo;
import bar;
import std::io;
int xz @private = 0;
macro Callback get_callback()
{
return fn int() { return bar::get_callback2()(); };
}
macro Callback get_callback2()
{
return fn int() { io::printfn("Hello"); return ++xz; };
}
module bar;
import foo;
typedef Callback = fn int();
macro Callback get_callback()
{
return fn int() { return foo::get_callback()(); };
}
macro Callback get_callback2()
{
return fn int() { return foo::get_callback2()(); };
}
/* #expect: abc.ll
store ptr @"bar.get_callback$lambda1", ptr %F, align 8
%0 = call i32 @abc.xy(ptr @"bar.get_callback$lambda1")
%1 = call i32 @abc.xy(ptr @"bar.get_callback$lambda1")
declare i32 @"bar.get_callback$lambda1"()
// #expect: foo.ll
define i32 @"foo.get_callback$lambda1"() #0 {
%0 = call i32 @"bar.get_callback2$lambda2"()
define i32 @"foo.get_callback2$lambda2"() #0 {
%1 = load i32, ptr @foo.xz, align 4
declare i32 @"bar.get_callback2$lambda2"()
// #expect: bar.ll
define i32 @"bar.get_callback$lambda1"() #0 {
entry:
%0 = call i32 @"foo.get_callback$lambda1"()
ret i32 %0
}
define i32 @"bar.get_callback2$lambda2"() #0 {
entry:
%0 = call i32 @"foo.get_callback2$lambda2"()
ret i32 %0
}
declare i32 @"foo.get_callback$lambda1"()
declare i32 @"foo.get_callback2$lambda2"()