Files
c3c/test/test_suite/from_docs/examples_macro_function.c3t
2021-11-16 17:46:44 +01:00

60 lines
1.3 KiB
C

// #target: x64-darwin
module example;
import std::io;
macro foo(a, b)
{
return a(b);
}
fn int square(int x)
{
return x * x;
}
fn int test()
{
int a = 2;
int b = 3;
return @foo(&square, 2) + a + b; // 9
// return @foo(square, 2) + a + b;
// Error the symbol "square" cannot be used as an argument.
}
// #expect: example.ll
define i32 @example.square(i32 %0) #0 {
entry:
%x = alloca i32, align 4
store i32 %0, i32* %x, align 4
%1 = load i32, i32* %x, align 4
%2 = load i32, i32* %x, align 4
%mul = mul i32 %1, %2
ret i32 %mul
}
define i32 @example.test() #0 {
entry:
%a = alloca i32, align 4
%b = alloca i32, align 4
%a1 = alloca i32 (i32)*, align 8
%b2 = alloca i32, align 4
%blockret = alloca i32, align 4
store i32 2, i32* %a, align 4
store i32 3, i32* %b, align 4
store i32 (i32)* @example.square, i32 (i32)** %a1, align 8
store i32 2, i32* %b2, align 4
%0 = load i32 (i32)*, i32 (i32)** %a1, align 8
%1 = load i32, i32* %b2, align 4
%2 = call i32 %0(i32 %1)
store i32 %2, i32* %blockret, align 4
br label %expr_block.exit
expr_block.exit: ; preds = %entry
%3 = load i32, i32* %blockret, align 4
%4 = load i32, i32* %a, align 4
%add = add i32 %3, %4
%5 = load i32, i32* %b, align 4
%add3 = add i32 %add, %5
ret i32 %add3
}