GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Crash when an override has fewer state refinements than the method it overrides · Issue #462 · liquid-java/liquidjava

Crash when an override has fewer state refinements than the method it overrides #462

New issue
Copy link
New issue
Copy link
Open
Open
Crash when an override has fewer state refinements than the method it overrides#462
Copy link
Labels
bugSomething isn't workingSomething isn't working

Description

@CatarinaGamboa
CatarinaGamboa
opened on Nov 2, 2026
Issue body actions

Impact: the verifier crashes on a valid program when an override has fewer @StateRefinements than the method it overrides.

Minimal reproducer

@StateSet({"off", "on"})
class A {
    @StateRefinement(to = "off(this)")
    A() {}

    @StateRefinement(from = "off(this)", to = "on(this)")
    @StateRefinement(from = "on(this)", to = "off(this)")
    void toggle() {}

    @StateRefinement(from = "on(this)")
    void use() {}
}

class B extends A {
    @Override
    @StateRefinement(from = "off(this)", to = "on(this)")
    void toggle() {}
}

class Client {
    static void f() {
        B b = new B();
        b.use();
    }
}

Actual: on main @ 19991d3:

Error while checking CtMethodImpl
  on toggle() {}
  at A.java:17
  with Index: 0
Caused by: java.lang.IndexOutOfBoundsException: Index: 0

That first crash comes from AuxHierarchyRefinementsPassage.transferStateRefinements indexing method.getParameters() with the index of the state refinement (toggle() has no parameters). The PR for #456 fixes it, and then the same example fails on the next line:

Caused by: java.lang.IndexOutOfBoundsException: Index 1 out of bounds for length 1
    at ...AuxHierarchyRefinementsPassage.transferStateRefinements (AuxHierarchyRefinementsPassage.java:139)

The loop goes over the superclass's state refinements and reads subStates.get(i) for each one, assuming that the override has the same number of refinements, in the same order.

Expected: no crash. A subclass's refinements should be checked against the superclass's as a whole, not pairwise by position: every state the superclass accepts should be accepted by the override, and the override's result should be one the superclass promises. If they are incompatible, the verifier should report the usual FROM/TO subtyping error instead of throwing.

Found while working on #456.

Activity

  1. CatarinaGamboa
    added
    bugSomething isn't workingSomething isn't working
    on Nov 2, 2026
  2. CatarinaGamboa
    added a commit that references this issue on Nov 3, 2026

    Give state hints when the state set or methods come from the receiver…

    dc1a63f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      You are visitor 01402503 — GeezerVison does not store the pages you look up.
      Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.