@@ -640,8 +640,15 @@ extends Importer:
640
640
else VarSymbol (id, nextUid)
641
641
642
642
def param (t : Tree ): Ctxl [Ls [Param ]] = t match
643
- case TypeDef (Mod , inner, N , N ) => param(inner)
644
- .map(p => p.copy(flags = p.flags.copy(mod = true )))
643
+ case TypeDef (Mod , inner, N , N ) =>
644
+ val ps = param(inner).map(p => p.copy(flags = p.flags.copy(mod = true )))
645
+ for p <- ps if p.flags.mod do p.sign match
646
+ case N =>
647
+ raise(ErrorReport (msg " Module parameters must have explicit types. " -> t.toLoc :: Nil ))
648
+ case S (ret) if ModuleChecker .isTypeParam(ret) =>
649
+ raise(ErrorReport (msg " Module parameters must have concrete types. " -> t.toLoc :: Nil ))
650
+ case _ => ()
651
+ ps
645
652
case _ => t.param.map: (p, t) =>
646
653
Param (FldFlags .empty, fieldOrVarSym(ParamBind , p), t.map(term))
647
654
@@ -710,7 +717,15 @@ extends Importer:
710
717
while trav.changed do
711
718
trav.changed = false
712
719
go(s)
720
+
721
+ object ModuleChecker :
713
722
723
+ /** Checks if a term is a reference to a type parameter. */
724
+ def isTypeParam (t : Term ): Bool = t.symbol
725
+ .filter(_.isInstanceOf [VarSymbol ])
726
+ .flatMap(_.asInstanceOf [VarSymbol ].decl)
727
+ .fold(false )(_.isInstanceOf [TyParam ])
728
+
714
729
class VarianceTraverser (var changed : Bool = true ) extends Traverser :
715
730
override def traverseType (pol : Pol )(trm : Term ): Unit = trm match
716
731
case Term .TyApp (lhs, targs) =>
0 commit comments