RFR: JDK-8247334: Trees.getScope crashes for annotated local records

Jan Lahoda jan.lahoda at oracle.com
Wed Jun 10 16:24:19 UTC 2020


Hi,

Consider code like this:
---
class Test {
     void t() {
         record R(@Annotation int i) {}
     }
}
@interface Annotation {}
---

Calling Trees.getScope for a TreePath pointing at @Annotation in 
"@Annotation int i" will crash with an exception.

The reason is that when the class is first attributed, a synthetic 
canonical constructor is created for the record. And when the scope is 
being computed, a copy of the method's body is created (including the 
synthetic constructor), and re-attributed. And, since this is a record, 
the constructors are entered first, then a default constructor is 
possibly created, and then members not entered in the first phase are 
entered. But the detection of these "other members" fails to detect the 
default constructor was already entered in the first phase, and as a 
consequence this default constructor is entered twice, which ultimately 
leads to the exception.

The proposed solution is to simply keep track if a constructor has been 
added and avoid entering any constructor except the added one during the 
second stage.

I was trying other fix directions, but those typically changed the order 
of members, either in Element.getEnclosedElements() or in the classfile, 
which seemed inappropriate for this fix.

Proposed webrev:
http://cr.openjdk.java.net/~jlahoda/8247334/webrev.00/

JBS:
https://bugs.openjdk.java.net/browse/JDK-8247334

How does this look?

Thanks!
     Jan



More information about the compiler-dev mailing list