From 0929d7a39ea55719e893a5a2ea7677cd32a4b455 Mon Sep 17 00:00:00 2001 From: Kacper Korban Date: Wed, 29 Jan 2025 10:03:09 +0100 Subject: [PATCH] Widen skolem types when adding parent refinements --- compiler/src/dotty/tools/dotc/core/NamerOps.scala | 7 +++++-- tests/pos/i22456.scala | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 tests/pos/i22456.scala diff --git a/compiler/src/dotty/tools/dotc/core/NamerOps.scala b/compiler/src/dotty/tools/dotc/core/NamerOps.scala index 363a01665564..10fc6a9fa46e 100644 --- a/compiler/src/dotty/tools/dotc/core/NamerOps.scala +++ b/compiler/src/dotty/tools/dotc/core/NamerOps.scala @@ -39,14 +39,17 @@ object NamerOps: */ extension (tp: Type) def separateRefinements(cls: ClassSymbol, refinements: mutable.LinkedHashMap[Name, Type] | Null)(using Context): Type = + val widenSkolemsMap = new TypeMap: + def apply(tp: Type) = mapOver(tp.widenSkolem) tp match case RefinedType(tp1, rname, rinfo) => try tp1.separateRefinements(cls, refinements) finally if refinements != null then + val rinfo1 = widenSkolemsMap(rinfo) refinements(rname) = refinements.get(rname) match - case Some(tp) => tp & rinfo - case None => rinfo + case Some(tp) => tp & rinfo1 + case None => rinfo1 case tp @ AnnotatedType(tp1, ann) => tp.derivedAnnotatedType(tp1.separateRefinements(cls, refinements), ann) case tp: RecType => diff --git a/tests/pos/i22456.scala b/tests/pos/i22456.scala new file mode 100644 index 000000000000..ed1241bc4b39 --- /dev/null +++ b/tests/pos/i22456.scala @@ -0,0 +1,4 @@ +import language.experimental.modularity + +class T(tracked val y: Int) +class C(tracked val x: Int) extends T(x + 1)