// Phase 1 step 1.6 (PLAN-FFI.md): non-void return shapes through // `#objc_call`. The Phase 1.3 lowering hardcoded void+2-arg only; // this test exercises five primitive return types via real // Foundation classes: // // *void — [NSObject class] returns Class (ptr) // bool — [NSObject isMemberOfClass: cls] returns BOOL // s32 — [NSString length] returns NSUInteger (treated as s32 here) // s64 — same shape, wider // f64 — [NSNumber doubleValue] returns double // // Today (1.6a, xfail): the lowering rejects non-void returns with // a diagnostic. Snapshot pins the diagnostic. // Next (1.6b/c): emit_llvm builds a per-call-site LLVM function // type from (recv, sel, args, ret_ty), shares one declared // `@objc_msgSend` symbol, dispatches with the right ABI. #import "modules/std.sx"; #import "modules/compiler.sx"; main :: () -> s32 { inline if OS == .macos { // *void return: [NSObject class] → Class cls := #objc_call(*void)(null, "class"); print("class non-null = {}\n", cls != null); } inline if OS != .macos { print("skipped (not macos)\n"); } 0; }