diff --git a/src/org/rascalmpl/library/lang/rascal/tests/functionality/Aliasing.rsc b/src/org/rascalmpl/library/lang/rascal/tests/functionality/Aliasing.rsc index 23ce14e003b..4a7c12d69f0 100644 --- a/src/org/rascalmpl/library/lang/rascal/tests/functionality/Aliasing.rsc +++ b/src/org/rascalmpl/library/lang/rascal/tests/functionality/Aliasing.rsc @@ -68,6 +68,21 @@ test bool assignThroughListAlias() { values[0] = 3; return values == [3, 2]; } + +alias Pair[&T] = tuple[&T first, int second]; + +test bool assignFieldThroughParameterizedTupleAlias() { + Pair[str] p = <"a", 1>; + p.second = 2; + return p == <"a", 2>; +} + +Pair[&T] incSecond(Pair[&T] p) { + p.second += 1; + return p; +} + +test bool assignFieldThroughGenericTupleAlias() = incSecond(<"a", 1>) == <"a", 2>; alias trans = tuple[str, str, str]; alias block = set[trans]; diff --git a/src/org/rascalmpl/semantics/dynamic/Assignable.java b/src/org/rascalmpl/semantics/dynamic/Assignable.java index 0687edb3896..09546790c10 100644 --- a/src/org/rascalmpl/semantics/dynamic/Assignable.java +++ b/src/org/rascalmpl/semantics/dynamic/Assignable.java @@ -239,9 +239,9 @@ public Result assignment(AssignableEvaluator __eval) { throw new UninitializedVariable(label, this.getReceiver()); } - if (receiver.getStaticType().isTuple()) { + if (receiver.getStaticUnaliasedType().isTuple()) { - int idx = receiver.getStaticType().getFieldIndex(label); + int idx = receiver.getStaticUnaliasedType().getFieldIndex(label); if (idx < 0) { throw new UndeclaredField(label, receiver.getStaticType(), this); }