From 18c6484fd2d022df287a79e0d3bdda6b5d867648 Mon Sep 17 00:00:00 2001 From: Kacper Korban Date: Mon, 5 Aug 2024 16:24:34 +0200 Subject: [PATCH] fix: Dealias NamedTuple's name types when resolving NamedTuple's element types [Cherry-picked e4f38d4b2c1e5b3a641e7a716362a629781ec59f] --- .../src/dotty/tools/dotc/core/TypeUtils.scala | 2 +- tests/pos/i21300.scala | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 tests/pos/i21300.scala diff --git a/compiler/src/dotty/tools/dotc/core/TypeUtils.scala b/compiler/src/dotty/tools/dotc/core/TypeUtils.scala index beacf15e4afe..ca0f0d7e43bd 100644 --- a/compiler/src/dotty/tools/dotc/core/TypeUtils.scala +++ b/compiler/src/dotty/tools/dotc/core/TypeUtils.scala @@ -129,7 +129,7 @@ class TypeUtils: def namedTupleElementTypesUpTo(bound: Int, normalize: Boolean = true)(using Context): List[(TermName, Type)] = (if normalize then self.normalized else self).dealias match case defn.NamedTuple(nmes, vals) => - val names = nmes.tupleElementTypesUpTo(bound, normalize).getOrElse(Nil).map: + val names = nmes.tupleElementTypesUpTo(bound, normalize).getOrElse(Nil).map(_.dealias).map: case ConstantType(Constant(str: String)) => str.toTermName case t => throw TypeError(em"Malformed NamedTuple: names must be string types, but $t was found.") val values = vals.tupleElementTypesUpTo(bound, normalize).getOrElse(Nil) diff --git a/tests/pos/i21300.scala b/tests/pos/i21300.scala new file mode 100644 index 000000000000..22859482ef98 --- /dev/null +++ b/tests/pos/i21300.scala @@ -0,0 +1,17 @@ +import scala.language.experimental.namedTuples + +class Test[S <: String & Singleton](name: S): + + type NT = NamedTuple.NamedTuple[(S, "foo"), (Int, Long)] + def nt: NT = ??? + + type Name = S + + type NT2 = NamedTuple.NamedTuple[(Name, "foo"), (Int, Long)] + def nt2: NT2 = ??? + +def test = + val foo = new Test("bar") + + foo.nt.bar + foo.nt2.bar