Hi all,
i've already reported that issue but it was theoretical because the support of 
the record pattern was not integrated into the jdk 19 at that time and i was 
not able to explain int clearly.  Now that the support is available, this code 
should throw a StackOverflow error but it creates a linked list of 
MatchException which makes it hard to debug.

Wrapping all exceptions into a runtime exception is not a good idea when you 
have recursive calls which is a kind of natural when you have pattern matching, 
for me it's a spec issue but i want to be sure.

BTW, the bug here lies in the fact that deconstructing Cons(int value, int 
size, RecChain next) calls the accessor size() which itself calls 
RecChain::size which is a nice puzzler by itself.

public sealed interface RecChain {
  default int size() {
    return switch (this) {
      case Nil __ -> 0;
      case Cons(int value, int size, RecChain next) -> 1 + next.size();
    };
  }

  record Nil() implements RecChain { }

  record Cons(int value, int size, RecChain next) implements RecChain {
    @Override
    public int size() {
      return size != -1? size: RecChain.super.size();
    }
  }

  public static void main(String[] args){
    RecChain chain = new Nil();
    for (var i = 0; i < 100; i++) {
      chain = new Cons(i, -1, chain);
    }
    System.out.println(chain.size());
  }
}

regards,
Rémi

Reply via email to