GROOVY-11831: fix TYPE_USE annotation crash on void method return type #2362
+7
−2
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
GROOVY-11831: Fix TYPE_USE annotation crash on void method return type
Summary
Fixes a compiler crash when an annotation without explicit
@Target(which defaults to all targets includingTYPE_USE) is added to a void method by an AST transformation.Error Message
BUG! exception in phase 'class generation' in source unit '...'
Adding type annotation @MyAnnotation to non-redirect node: void
Root Cause
In
ExtendedVerifier.extractTypeUseAnnotations(), when processing TYPE_USE annotations on a void method, the code attempts to calladdTypeAnnotations()on the void return type. Sincevoidis a non-redirect node, this crashes.Fix
Added a guard to skip
addTypeAnnotations()for void methods only:Testing
A unit test is not included because the bug only triggers when:
Groovy's test framework compiles everything in one stage, making it impossible to reproduce this scenario in a single test.
Manual verification: The fix is verified with a standalone reproduction project:
https://github.com/ayoube-ait/groovy-bug-repro
Impact
This bug affects Micronaut Framework's Groovy support. The @internal annotation in micronaut-core has no explicit @target and is used in AST transformations that generate void methods, preventing Groovy scripts from compiling with Micronaut 5 and Groovy 5.