diff --git a/compiler/src/dotty/tools/dotc/ast/TreeInfo.scala b/compiler/src/dotty/tools/dotc/ast/TreeInfo.scala index 3ca0d3bcfa67..ee45e5f967d9 100644 --- a/compiler/src/dotty/tools/dotc/ast/TreeInfo.scala +++ b/compiler/src/dotty/tools/dotc/ast/TreeInfo.scala @@ -869,7 +869,7 @@ trait TypedTreeInfo extends TreeInfo[Type] { self: Trees.Instance[Type] => case RefinedType(parent, rname, rinfo) => rname == tree.name || hasRefinement(parent) case tp: TypeProxy => - hasRefinement(tp.underlying) + hasRefinement(tp.superType) case tp: AndType => hasRefinement(tp.tp1) || hasRefinement(tp.tp2) case tp: OrType => diff --git a/tests/neg/i15448.scala b/tests/neg/i15448.scala new file mode 100644 index 000000000000..17d958014dee --- /dev/null +++ b/tests/neg/i15448.scala @@ -0,0 +1,11 @@ +object Minimized: + type Pointer[S <: Int] <: S + + type Break = Int { + def boom: Unit + } + + def test = { + val ptrBreak: Pointer[Break] = ??? + ptrBreak.boom // error Required: Selectable, was boom crashes the compiler + } \ No newline at end of file diff --git a/tests/pos/i15448.scala b/tests/pos/i15448.scala new file mode 100644 index 000000000000..112776622e5f --- /dev/null +++ b/tests/pos/i15448.scala @@ -0,0 +1,21 @@ +object SelectableBreaks1 { + object opaques { + opaque type Pointer[S] <: S = S + object Pointer { + implicit class PointerSelectable[S](private val f: Pointer[S]) extends Selectable { + def selectDynamic(name: String): Any = ??? + def applyDynamic(name: String)(): Any = ??? + } + } + } + import opaques.* + + type Break = AnyRef { + def boom(): Nothing + } + + def makeBreak(): Pointer[Break] = ??? + + makeBreak().boom() +} +