RFR: JDK-8237041: AssertionError while parsing unclosed class declarations

Vicente Romero vicente.romero at oracle.com
Tue Aug 25 15:48:57 UTC 2020


I see, thanks for the clarification, looks good to me,

Vicente

On 8/25/20 3:57 AM, Jan Lahoda wrote:
> On 24. 08. 20 21:11, Vicente Romero wrote:
>> Hi Jan,
>>
>> I'm curious that the user commented that the issue was only 
>> reproducible when APs were present. Wouldn't that mean that there is 
>> some data that is not being cleaned up after AP iterations?
>
> It happens even without an annotation processor, but without an 
> annotation processor, the errors are reported immediately and the 
> exception is concealed from the user by:
> https://github.com/openjdk/jdk/blob/4895a19dd195ff01cc67411e1f113ce77ddfe418/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Main.java#L348 
>
>
> When annotation processors are used, the errors are stashed on side, 
> and then the parser crashes before the errors are actually reported, 
> and hence the error is shown to the user.
>
> Jan
>
>>
>> Thanks,
>> Vicente
>>
>> On 8/20/20 8:21 AM, Jan Lahoda wrote:
>>> Hi,
>>>
>>> Consider a simplified testcase from the report (the code is 
>>> obviously erroneous):
>>> ---
>>> class T {
>>>      String.class,
>>>      String.class,
>>>      //String.class, repeated many times
>>> }
>>>
>>> This crashes the parser in a safety code that is intended to prevent 
>>> infinite loops in the parser. This code crashes the parser when 
>>> there is too many errors reported on the same point in the source code.
>>>
>>> There are two somewhat independent problematic parts in the code:
>>> -first, consider code like this:
>>> ---
>>> class T {
>>>     class C1 {
>>>          class C2 {
>>>          //many more nested classes
>>> //but no closing '}'
>>> ---
>>>
>>> This is triggering the safety code, as it reports an "premature EOF" 
>>> error for each of the classes, when it cannot find the closing 
>>> brace. The proposed fix for this is to disable the safety code when 
>>> the token that is being handled is an EOF token. (An alternative 
>>> would be to remove the safety check altogether.)
>>>
>>> -for code like this:
>>> ---
>>> class T {
>>>      class
>>>      class
>>>      class
>>> }
>>> ---
>>>
>>> the parser will parse this code like:
>>> ---
>>> class T {
>>>      class {
>>>          class {
>>>              class {
>>> ...
>>> ---
>>>
>>> I.e. the AST nodes for the classes will be nested. That does not 
>>> seem ideal, as there are no opening braces for the classes. It seems 
>>> it would be better to parse like:
>>> ---
>>> class T {
>>>      class {}
>>>      class {}
>>>      class {}
>>> ---
>>>
>>> The second proposed change in JavacParser attempts to do that, i.e. 
>>> rather return an empty "class" body than continue parsing the class 
>>> content if there is no opening brace. This required some tweaks to 
>>> expected outputs for some tests.
>>>
>>> The proposed patch is here:
>>> http://cr.openjdk.java.net/~jlahoda/8237041/webrev.00/index.html
>>>
>>> JBS:
>>> https://bugs.openjdk.java.net/browse/JDK-8237041
>>>
>>> How does this look?
>>>
>>> Thanks,
>>>      Jan
>>



More information about the compiler-dev mailing list