@@ -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