Switch expressions spec

Alex Buckley alex.buckley at oracle.com
Wed Mar 20 00:28:17 UTC 2019

Hi Leonid,

So there are no negative tests that check what happens if a switch 
expression has no result expressions?


On 3/19/2019 5:24 PM, leonid.arbouzov at oracle.com wrote:
> There are tests on switch expression with cases that throwing exception,
> causing division by zero, index out of range, etc.
> These are all positive tests i.e. compile fine.
> Thanks,
> Leonid
> On 3/15/19 1:20 PM, Alex Buckley wrote:
>> OK, we intend at least one result expression to be required, so the
>> spec is correct as is.
>> (I should have been clearer that my belief was about the intent of the
>> spec, rather than about how I personally think completion should occur.)
>> Manoj didn't say what javac build he is testing with, but this is a
>> substantial discrepancy between compiler and spec. I hope that Leonid
>> Arbouzov (cc'd) can tell us what conformance tests exist in this area.
>> Alex
>> On 3/15/2019 12:09 PM, Brian Goetz wrote:
>>> At the same time, we also reaffirmed our choice to _not_ allow throw
>>> from one half of a conditional:
>>>      int x = foo ? 3 : throw new FooException()
>>> But John has this right — the high order bit is that every expression
>>> should have a defined normal completion, and a type, even if
>>> computing sub-expressions (or in this case, sub-statements) might
>>> throw.  And without at least one arm yielding a value, it would be
>>> impossible to infer the type of the expression.
>>>> On Mar 15, 2019, at 3:01 PM, John Rose <john.r.rose at oracle.com> wrote:
>>>> On Mar 15, 2019, at 11:39 AM, Alex Buckley <alex.buckley at oracle.com>
>>>> wrote:
>>>>> In a switch expression, I believe it should be legal for every
>>>>> `case`/`default` arm to complete abruptly _for a reason other than
>>>>> a break with value_.
>>>> My reading of Gavin's draft is that he is doing something very
>>>> subtle there, which is to retain an existing feature in the language
>>>> that an expression always has a defined normal completion.
>>>> We also don't have expressions of the form "throw e". Allowing
>>>> a switch expression to complete without a value on *every* arm
>>>> raises the same question as "throw e" as an expression.  How do
>>>> you type "f(throw e)"?  If you can answer that, then you can also
>>>> have switch expressions that refuse to break with any values.
>>>> BTW, if an expression has a defined normal completion, it also
>>>> has a possible type.  By possible type I mean at least one correct
>>>> typing (poly-expressions can have many).  So one obvious
>>>> result of Gavin's draft is that you derive possible types from
>>>> the arms of the switch expression that break with values.
>>>> But the root requirement, I think, is to preserve the possible
>>>> normal normal of every expression.
>>>> "What about some form of 1/0?"  That's a good question.
>>>> What about it?  It completes normally with a type of int.
>>>> Dynamically, the normal completion is never taken.
>>>> Gavin might call that a "notional normal completion"
>>>> (I like that word) provided to uphold the general principle
>>>> even where static analysis proves that the Turing machine
>>>> fails to return normally.
>>>> — John

More information about the amber-spec-observers mailing list