Skip to content

Commit bfb8a9d

Browse files
committed
Make it a fatal error if erasure cannot resolve a type
Fixes #16368
1 parent 716d93d commit bfb8a9d

File tree

1 file changed

+18
-6
lines changed

1 file changed

+18
-6
lines changed

compiler/src/dotty/tools/dotc/core/TypeErasure.scala

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -591,17 +591,17 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
591591
tp
592592
case tp: TypeRef =>
593593
val sym = tp.symbol
594-
if (!sym.isClass) this(tp.translucentSuperType)
595-
else if (semiEraseVCs && isDerivedValueClass(sym)) eraseDerivedValueClass(tp)
596-
else if (defn.isSyntheticFunctionClass(sym)) defn.functionTypeErasure(sym)
594+
if !sym.isClass then this(checkedSuperType(tp))
595+
else if semiEraseVCs && isDerivedValueClass(sym) then eraseDerivedValueClass(tp)
596+
else if defn.isSyntheticFunctionClass(sym) then defn.functionTypeErasure(sym)
597597
else eraseNormalClassRef(tp)
598598
case tp: AppliedType =>
599599
val tycon = tp.tycon
600600
if (tycon.isRef(defn.ArrayClass)) eraseArray(tp)
601601
else if (tycon.isRef(defn.PairClass)) erasePair(tp)
602602
else if (tp.isRepeatedParam) apply(tp.translateFromRepeated(toArray = sourceLanguage.isJava))
603603
else if (semiEraseVCs && isDerivedValueClass(tycon.classSymbol)) eraseDerivedValueClass(tp)
604-
else apply(tp.translucentSuperType)
604+
else this(checkedSuperType(tp))
605605
case tp: TermRef =>
606606
this(underlyingOfTermRef(tp))
607607
case _: ThisType =>
@@ -689,6 +689,18 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
689689
tp
690690
}
691691

692+
/** Like translucentSuperType, but issue a fatal error if it does not exist. */
693+
private def checkedSuperType(tp: TypeProxy)(using Context): Type =
694+
val tp1 = tp.translucentSuperType
695+
if !tp1.exists then
696+
val msg = tp.typeConstructor match
697+
case tycon: TypeRef =>
698+
MissingType(tycon.prefix, tycon.name).toMessage.message
699+
case _ =>
700+
i"Cannot resolve reference to $tp"
701+
throw FatalError(msg)
702+
tp1
703+
692704
/** Widen term ref, skipping any `()` parameter of an eventual getter. Used to erase a TermRef.
693705
* Since getters are introduced after erasure, one would think that erasing a TermRef
694706
* could just use `widen`. However, it's possible that the TermRef got read from a class
@@ -815,7 +827,7 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
815827
throw new MissingType(tp.prefix, tp.name)
816828
val sym = tp.symbol
817829
if (!sym.isClass) {
818-
val info = tp.translucentSuperType
830+
val info = checkedSuperType(tp)
819831
if (!info.exists) assert(false, i"undefined: $tp with symbol $sym")
820832
return sigName(info)
821833
}
@@ -841,7 +853,7 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
841853
sigName( // todo: what about repeatedParam?
842854
if (erasureDependsOnArgs(sym)) this(tp)
843855
else if (sym.isClass) tp.underlying
844-
else tp.translucentSuperType)
856+
else checkedSuperType(tp))
845857
case ErasedValueType(_, underlying) =>
846858
sigName(underlying)
847859
case JavaArrayType(elem) =>

0 commit comments

Comments
 (0)