Record pattern and side effects

Remi Forax forax at
Sun Apr 17 09:48:50 UTC 2022

This is something i think we have no discussed, with a record pattern, the switch has to call the record accessors, and those can do side effects,
revealing the order of the calls to the accessors.

So by example, with a code like this

  record Foo(Object o1, Object o2) {
    public Object o2() {
      throw new AssertionError();

  void int m(Foo foo) {
    return switch(foo) {
      case Foo(String s, Object o2) -> 1
      case Foo foo -> 2

  m(new Foo(3, 4));   // throw AssertionError ?

Do the call throw an AssertionError ?
I believe the answer is no, because 3 is not a String, so Foo::o2() is not called.


More information about the amber-spec-experts mailing list