¿Por qué el motor de expresiones regulares de Java lanza StringIndexOutOfBoundsException en una repetición +?

He escrito un patrón de expresiones regulares para encontrar números de Fibonacci (no importa por qué, solo lo hice). Funciona maravillosamente como se esperaba (ver en ideone.com):

    String FIBONACCI = 
        "(?x) .{0,2} | (?: (?=(\\2?)) (?=(\\2\\3|^.)) (?=(\\1)) \\2)++ . ";

    for (int n = 0; n < 1000; n++) {
        String s = new String(new char[n]);
        if (s.matches(FIBONACCI)) {
            System.out.print(n + " ");
        }
    } // 0 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 

A posesivo&nbsp;repetición (es decir++&nbsp;en el "bucle" principal) es crucial, porque no desea retroceder con este algoritmo de coincidencia. Sin embargo, hacer que la repetición sea rastreable (es decir, solo+&nbsp;en el "bucle" principal) no se producen desajustes, sino una excepción de tiempo de ejecución. (como se ve en ideone.com):

Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
    String index out of range: -1

    at java.lang.String.charAt(String.java:686)
    at java.lang.Character.codePointAt(Character.java:2335)
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3344)
    at java.util.regex.Pattern$GroupCurly.match0(Pattern.java:3994)
    at java.util.regex.Pattern$GroupCurly.match0(Pattern.java:3966)
    at java.util.regex.Pattern$GroupCurly.match(Pattern.java:3916)
    at java.util.regex.Pattern$Branch.match(Pattern.java:4114)
    at java.util.regex.Matcher.match(Matcher.java:1127)
    at java.util.regex.Matcher.matches(Matcher.java:502)
    at java.util.regex.Pattern.matches(Pattern.java:930)
    at java.lang.String.matches(String.java:2090)

¿Alguien puede explicar lo que pasó aquí? ¿Es esto un error en el motor Java regex?