RFR: JDK-8239447: compiler error for annotations applied to record components with target METHOD

Vicente Romero vicente.romero at oracle.com
Fri Mar 13 13:24:08 UTC 2020


thanks,
Vicente

On 3/13/20 9:07 AM, Maurizio Cimadamore wrote:
> Looks good
>
> Maurizio
>
> On 13/03/2020 12:45, Vicente Romero wrote:
>> I have modified the patch to include the previous code too, please 
>> check [1]
>>
>> Thanks,
>> Vicente
>>
>> [1] http://cr.openjdk.java.net/~vromero/8239447/webrev.02/
>>
>> On 3/13/20 6:39 AM, Maurizio Cimadamore wrote:
>>> I agree that this is a better solution, thanks for investigating.
>>>
>>> In general sharing trees is best avoided as it can lead (as in this 
>>> case) to very odd, and hard to diagnose failures.
>>>
>>> It is possible that the patch you had yesterday is also needed - you 
>>> might want to double check with Jan about that; perhaps a different 
>>> test case might reveal some issues with the lack of cleanup in the 
>>> annotation processing round.
>>>
>>> Maurizio
>>>
>>> On 13/03/2020 06:02, Vicente Romero wrote:
>>>> Hi
>>>>
>>>> On 3/12/20 8:13 PM, Maurizio Cimadamore wrote:
>>>>> Looks good - I wonder: why wasn't this failing if TYPE_USE was 
>>>>> used as a target? I know that processing for type annotations is 
>>>>> quite different, but I'm still a bit surprised to see that the 
>>>>> data from previous rounds doesn't cause issues in that case.
>>>>
>>>> I also thought that the difference was due to the different nature 
>>>> of type annotations. But while double checking to answer you I 
>>>> discovered that the cause is a bug in the records implementation, 
>>>> let's assume we have:
>>>>
>>>> record R(@MyAnno int i) {}
>>>>
>>>> currently what is happening is that the same AST created by the 
>>>> parser for the annotation in the record header is shared by the 
>>>> generated field, the record component, the accessor and the 
>>>> parameter in the generated constructor. Exactly the same AST. This 
>>>> is the root cause behind the reason why in some cases the 
>>>> information from a previous round was being cleared and sometimes 
>>>> not. I think that a cleaner solution should be to create different 
>>>> ASTs per each record member. So this way each member including 
>>>> record components will have their own AST. This fixes this bug and 
>>>> probably others that were potentially lurking in this area. I have 
>>>> uploaded a new iteration to [1].
>>>>
>>>>>
>>>>> Maurizio
>>>>
>>>> Thanks,
>>>> Vicente
>>>>
>>>> [1] http://cr.openjdk.java.net/~vromero/8239447/webrev.01/
>>>>>
>>>>> On 12/03/2020 17:57, Vicente Romero wrote:
>>>>>> ping
>>>>>>
>>>>>> On 3/7/20 12:34 AM, Vicente Romero wrote:
>>>>>>> Please review fix for [1] at [2]. When there are APs involved, 
>>>>>>> every time a new round of annotation processing will start, a 
>>>>>>> visitor, see [3], sets the attribute field of annotation ASTs to 
>>>>>>> null. This visitor was not visiting some annotations stored at 
>>>>>>> the record component. This provoked that data from previous 
>>>>>>> rounds could be accessible to later rounds provoking later 
>>>>>>> annotation validation code to fail. Just visiting the 
>>>>>>> annotations at the record component as it is done for the rest 
>>>>>>> of the annotations has fixed the issue.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Vicente
>>>>>>>
>>>>>>> [1] https://bugs.openjdk.java.net/browse/JDK-8239447
>>>>>>> [2] http://cr.openjdk.java.net/~vromero/8239447/webrev.00/
>>>>>>> [3] 
>>>>>>> http://hg.openjdk.java.net/jdk/jdk/file/7af6364e1792/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java#l1591
>>>>>>
>>>>
>>



More information about the compiler-dev mailing list