mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
119 lines
2.6 KiB
Plaintext
119 lines
2.6 KiB
Plaintext
// #target: macos-x64
|
|
module test;
|
|
import std::io;
|
|
alias IntFn = fn int();
|
|
|
|
macro IntFn @dofn($m, $n) {
|
|
return fn int () => $m;
|
|
}
|
|
|
|
macro IntFn[*] @doallfn($n) {
|
|
IntFn[$n] $vec;
|
|
$for var $i = 0; $i < $n; $i++:
|
|
$vec[$i] = @dofn($i, $i);
|
|
$endfor
|
|
return $vec;
|
|
}
|
|
|
|
IntFn[*] lambda_arr = @doallfn(3);
|
|
|
|
fn void main()
|
|
{
|
|
int x;
|
|
$for var $i = 0; $i < 4; $i++:
|
|
x = @dofn($i, 0)();
|
|
$endfor
|
|
$for var $i = 0; $i < 4; $i++:
|
|
x = @dofn($i, 1)();
|
|
$endfor
|
|
foreach (i : lambda_arr)
|
|
{
|
|
x = i();
|
|
}
|
|
}
|
|
|
|
/* #expect: test.ll
|
|
|
|
|
|
define void @test.main() #0 {
|
|
entry:
|
|
%x = alloca i32, align 4
|
|
%.anon = alloca i64, align 8
|
|
%i = alloca ptr, align 8
|
|
store i32 0, ptr %x, align 4
|
|
%0 = call i32 @"test.$global$lambda1"()
|
|
store i32 %0, ptr %x, align 4
|
|
%1 = call i32 @"test.@dofn$lambda4"()
|
|
store i32 %1, ptr %x, align 4
|
|
%2 = call i32 @"test.@dofn$lambda5"()
|
|
store i32 %2, ptr %x, align 4
|
|
%3 = call i32 @"test.@dofn$lambda6"()
|
|
store i32 %3, ptr %x, align 4
|
|
%4 = call i32 @"test.@dofn$lambda7"()
|
|
store i32 %4, ptr %x, align 4
|
|
%5 = call i32 @"test.$global$lambda2"()
|
|
store i32 %5, ptr %x, align 4
|
|
%6 = call i32 @"test.@dofn$lambda5"()
|
|
store i32 %6, ptr %x, align 4
|
|
%7 = call i32 @"test.@dofn$lambda6"()
|
|
store i32 %7, ptr %x, align 4
|
|
store i64 0, ptr %.anon, align 8
|
|
br label %loop.cond
|
|
|
|
loop.cond: ; preds = %loop.body, %entry
|
|
%8 = load i64, ptr %.anon, align 8
|
|
%gt = icmp ugt i64 3, %8
|
|
br i1 %gt, label %loop.body, label %loop.exit
|
|
|
|
loop.body: ; preds = %loop.cond
|
|
%9 = load i64, ptr %.anon, align 8
|
|
%ptroffset = getelementptr inbounds [8 x i8], ptr @test.lambda_arr, i64 %9
|
|
%10 = load ptr, ptr %ptroffset, align 8
|
|
store ptr %10, ptr %i, align 8
|
|
%11 = load ptr, ptr %i, align 8
|
|
%12 = call i32 %11()
|
|
store i32 %12, ptr %x, align 4
|
|
%13 = load i64, ptr %.anon, align 8
|
|
%addnuw = add nuw i64 %13, 1
|
|
store i64 %addnuw, ptr %.anon, align 8
|
|
br label %loop.cond
|
|
|
|
loop.exit: ; preds = %loop.cond
|
|
ret void
|
|
}
|
|
|
|
define internal i32 @"test.@dofn$lambda4"() #0 {
|
|
entry:
|
|
ret i32 1
|
|
}
|
|
|
|
define internal i32 @"test.@dofn$lambda5"() #0 {
|
|
entry:
|
|
ret i32 2
|
|
}
|
|
|
|
define internal i32 @"test.@dofn$lambda6"() #0 {
|
|
entry:
|
|
ret i32 3
|
|
}
|
|
|
|
define internal i32 @"test.@dofn$lambda7"() #0 {
|
|
entry:
|
|
ret i32 0
|
|
}
|
|
|
|
define internal i32 @"test.$global$lambda3"() #0 {
|
|
entry:
|
|
ret i32 2
|
|
}
|
|
|
|
define internal i32 @"test.$global$lambda2"() #0 {
|
|
entry:
|
|
ret i32 1
|
|
}
|
|
|
|
define internal i32 @"test.$global$lambda1"() #0 {
|
|
entry:
|
|
ret i32 0
|
|
}
|