Scott Murphy Heiberg created GROOVY-12615:
---------------------------------------------
Summary: Compound assignment to a trait field nested in the right
operand of another compound assignment fails at run time
Key: GROOVY-12615
URL: https://issues.apache.org/jira/browse/GROOVY-12615
Project: Groovy
Issue Type: Bug
Affects Versions: 5.0.8, 4.0.33, 6.0.0
Reporter: Scott Murphy Heiberg
{code:groovy}
trait T { int a = 1, b = 1; def m() { a += (b += 1); [a, b] } }
class C implements T {}
assert new C().m() == [3, 2]
{code}
Actual: dynamic and type-checked code throws {{java.lang.ClassCastException:
Cannot cast java.lang.Integer to T$Trait$FieldHelper}}; with @CompileStatic it
throws {{GroovyCastException: Cannot cast object '2' with class
'java.lang.Integer' to class 'T'}}. With static trait fields it throws a
VerifyError (dynamic) or fails to compile (@CompileStatic). A postfix update in
the same position, {{a += (b++)}}, compiles and silently loses the increment,
although postfix updates of trait fields are a compile error everywhere else.
Expected: [3, 2], and a postfix update there rejected with "Postfix expressions
on trait fields/properties are not supported in traits."
Cause: NAryOperationRewriter rewrites x op= y into x = x op y but reuses the
right operand without transforming it, so a nested compound assignment to a
trait field stays a compound assignment applied to the field helper call, and a
nested postfix update is never checked.
Seen in 4.0.33, 5.0.8 and 6.0.0.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)