// M1.2 A.4 — class-pair registration with the Obj-C runtime.
//
// Every sx-defined '#objc_class' produces a module-init constructor
// (registered in '@llvm.global_ctors' AND injected at the top of
// 'main' for the ORC JIT path) that calls:
//
//   super = objc_getClass("NSObject")
//   cls   = objc_allocateClassPair(super, "SxFoo", 0)
//   objc_registerClassPair(cls)
//
// After the constructor runs, 'objc_getClass("SxFoo")' returns the
// freshly registered class — the round-trip we verify below.
//
// Methods, the '__sx_state' ivar, and the '+alloc' / '-dealloc'
// overrides land in A.4b / A.5 / A.6; this slice just makes the
// class EXIST in the runtime.

#import "modules/std.sx";
#import "modules/compiler.sx";
#import "modules/std/objc.sx";

SxFoo :: #objc_class("SxFoo") {
    counter: s32;

    bump :: (self: *Self) {
        self.counter += 1;
    }
}

main :: () -> s32 {
    inline if OS == .macos {
        cls : Class = objc_getClass("SxFoo".ptr);
        if cls == null {
            print("FAIL: SxFoo not registered\n");
            return 1;
        }
        print("registered: SxFoo\n");
    }
    inline if OS != .macos {
        print("registered: SxFoo\n");
    }
    0;
}
