// #target: macos-x64 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 }