RFR: JDK-8247790: javac shouldn't allow type variable references from local static declarations

Jan Lahoda jan.lahoda at oracle.com
Tue Jun 23 09:12:06 UTC 2020


Hi Vicente,

I think this is a good direction, but probably not sufficient. My 
question would be if it is possible to piggy back more on the existing 
"staticOnly" flag, instead of checking the innermost environment.

Specifically, consider this example:
---
package javaapplication29;

public class JavaApplication29 {

     public static <T> void main(String[] args) {
         String hello = "hello";
         interface I {
             public default void test1() {
                 class X {
                     public void test2() {
                         System.err.println(hello);
                         T t = null;
                     }
                 }
                 new X().test2();
             }
         }
         record R(int i) {
             public void test1() {
                 class X {
                     public void test2() {
                         System.err.println(hello);
                         T t = null;
                     }
                 }
                 new X().test2();
             }
         }
         enum E {
             A;
             public void test1() {
                 class X {
                     public void test2() {
                         System.err.println(hello);
                         T t = null;
                     }
                 }
                 new X().test2();
             }
         }
         new I() {}.test1();
         new R(0).test1();
         E.A.test1();
     }

}
---

The behavior here does not seem to be quite right - there are no errors 
reported, but javac crashes on "E", produces wrong classfile for "I" and 
suspicious (but working) classfile for "R".

Jan

On 23. 06. 20 0:29, Vicente Romero wrote:
> Hi,
> 
> Please review the fix for [1] at [2]. The issue here is that local 
> interfaces, enums and records shouldn't be allow to refer to type 
> variables defined in an enclosing context. The compiler was checking for 
> this if the type variables were defined by the enclosing class but 
> references to type variables defined by the enclosing method were 
> allowed. This patch is covering this gap,
> 
> Thanks,
> Vicente
> 
> [1] http://cr.openjdk.java.net/~vromero/8247790/webrev.00/
> [2] https://bugs.openjdk.java.net/browse/JDK-8247790


More information about the compiler-dev mailing list