// EXTRA_OBJC_SOURCES: objc_instance_variable.m
// REQUIRED_ARGS: -L-framework -LFoundation

import core.attribute : selector;

extern (Objective-C) extern class NSObject {}

// Defined in `runnable/extra-files/objc_instance_variable.m`
extern (Objective-C)
extern class Foo : NSObject
{
    // int a = 1;
    // int b = 2;
    // int c = 3;

    // Intentionally not declared the above instance variables here to simulate
    // that the base class has changed.
}

extern (Objective-C)
class Bar : Foo
{
    int d;

    static Bar alloc() @selector("alloc");
    Bar init() @selector("init");
    void release() @selector("release");

    void bar() @selector("bar") {}
}

// This is implemented in `runnable/extra-files/objc_instance_variable.m` and
// returns the value of instance variable `c`.
extern (C) int getInstanceVariableC(Foo);

// This is implemented in `runnable/extra-files/objc_instance_variable.m` and
// sets the a value for the instance variables `a`, `b` and `c`.
extern (C) int setInstanceVariables(Foo);

import core.stdc.stdio;

void main()
{
    auto bar = Bar.alloc.init;
    scope (exit) bar.release();

    setInstanceVariables(bar);
    bar.d = 4;

    // if non-fragile instance variables didn't work this would be `4`.
    assert(getInstanceVariableC(bar) == 3);
}
