On Fri, 19 Mar 2021 at 10:53, Nikita Popov <[email protected]> wrote:

> On Fri, Mar 19, 2021 at 3:45 PM Marco Pivetta <[email protected]> wrote:
>
>> Hey Nikita,
>>
>> On Fri, Mar 19, 2021, 14:35 Nikita Popov <[email protected]> wrote:
>>
>>>
>>> Is it allowed to declare a noreturn function that returns by reference?
>>>
>>> function &foo(): noreturn {}
>>>
>>
>> Given that `noreturn` means it should throw, loop forever or exit, how
>> would a by-ref usage be applied/useful?
>>
>> Or is it a hint at a missing test?
>>
>
> Mainly a hint for missing spec ;)
>
> Context is that we're considering to deprecate by-ref void return (
> https://wiki.php.net/rfc/deprecations_php_8_1#return_by_reference_with_void_type),
> so it would make sense to me to prohibit this for noreturn from the start.
>
> However, I could also see an argument for why allowing it may be useful
> due to variance considerations. It would allow you to write something like
> this:
>
> <?php
> class A {
>     public function &test(): int { ... }
> }
> class B extends A {
>     public function &test(): noreturn { throw new Exception; }
> }
>
> While dropping the by-ref return on B::test() would be forbidden by
> variance (and I don't think we'd want to add more special rules here, like
> ignoring ref-return variance for noreturn functions).
>
> Regards,
> Nikita
>

I think it should be allowed due to the variance considerations – I've
updated the RFC to include your example.

Reply via email to