There seems to be a key thing happening here: --- struct SignalImpl { @disable this(this); // SignalImpl is now non-POD } --- Because of this, TypeFunction::toCtype sets TREE_ADDRESSABLE on functions returning SignalImpl (which is correct behaviour, we do *not* want non-POD types to return in registers). However... --- ref RestrictedSignal valueChanged() { return valueChangedSg.mRestricted; // returned by ref } --- Reference returns should not have TREE_ADDRESSABLE set as they are already returning in memory.