paulk-asert opened a new pull request, #2796:
URL: https://github.com/apache/groovy/pull/2796

   …member being visited
   
   Temporary type information from instanceof is keyed by the target variable — 
for a field access, the shared FieldNode. if/loops/ternaries and expression 
statements bracket their own frames, but a narrowing recorded at statement 
level (an explicit `return field instanceof Sub`, or an `assert field 
instanceof Sub`, whose propagation to subsequent statements is intentional) 
lands in the enclosing frame, which was the frame pushed for the whole class 
visit. Keyed by the shared FieldNode, it then applied to every member visited 
afterwards: the checker stamped the narrowed type on unrelated field reads and 
the static compiler emitted a spurious checkcast, throwing ClassCastException 
at runtime whenever the field held a different subtype.
   
   Members now push their own frame (methods and constructors, property and 
field initializers, object initializer blocks), so statement-level narrowing 
still flows within a member but can never survive into another; narrowing has 
no meaning past the member boundary. Intra-member flow typing (assert, 
if-branch) is unchanged.
   
   The checker-side leak predates Groovy 5 but was masked by codegen: 
StaticTypesTypeChooser resolved types from the declared target first until 
GROOVY-11375 (5.0.0-alpha-9) gave the expression-stamped inferred type 
priority, exposing the stale narrowing as a checkcast. That change is correct; 
the fix belongs here.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to