Re: [RFC] noreturn type

From: Date: Wed, 10 Mar 2021 21:43:30 +0000
Subject: Re: [RFC] noreturn type
References: 1 2 3 4  Groups: php.internals 
Request: Send a blank email to internals+get-113456@lists.php.net to get a copy of this message
On Wed, 10 Mar 2021 at 16:04, Kamil Tekiela <tekiela246@gmail.com> wrote:

> I am concerned with some edge cases. What if a function both returns and
> throws at the same time? For example:
>
> function a():noreturn {
>     return throw new Exception('Boom!');
> }
>
> or
>
> function a():noreturn {
> try {
> throw new Exception('Boom!');
> } finally {
>         return;
>     }
> }
>

In both cases those are compile-time errors, since no return is allowed in
a function that has the noreturn type.

I've added both as tests (
https://github.com/php/php-src/pull/6761/commits/56ae52e84da5c063c28ba7739ac15979e61afc91)
but I don't _think_ it's necessary to mention it in the PR given how much
of an edge-case it is.


> Also, the message "TypeError: a(): Nothing was expected to be returned" is
> inaccurate. It should say that the function should terminate instead of
> returning. It's also not a TypeError if no value is expected. At the moment
> it sounds like we need to make the function somehow return nothing.
>

It's a TypeError because noreturn is a type, but I agree the error message
could be improved.

Ilija suggested "noreturn function was expected to throw, terminate or run
infinitely" and I'd welcome other suggestions.


> If we are to bikeshed about the name then we might also consider other
> possibilities: None, Nothing, Returnless
>

I'd prefer to stick to noreturn and never, which have plenty of precedent
in other languages' type systems.


Thread (37 messages)

« previous php.internals (#113456) next »