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