mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
50 lines
1006 B
C
50 lines
1006 B
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:
|
|
%mul = mul i32 %0, %0
|
|
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
|
|
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)
|
|
%3 = load i32, i32* %a, align 4
|
|
%add = add i32 %2, %3
|
|
%4 = load i32, i32* %b, align 4
|
|
%add3 = add i32 %add, %4
|
|
ret i32 %add3
|
|
} |