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