aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/typer/Checking.scala13
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala6
2 files changed, 16 insertions, 3 deletions
diff --git a/src/dotty/tools/dotc/typer/Checking.scala b/src/dotty/tools/dotc/typer/Checking.scala
index 9092523db..8f4a8b72b 100644
--- a/src/dotty/tools/dotc/typer/Checking.scala
+++ b/src/dotty/tools/dotc/typer/Checking.scala
@@ -16,6 +16,7 @@ import Trees._
import ProtoTypes._
import Constants._
import Scopes._
+import ErrorReporting.errorTree
import annotation.unchecked
import util.Positions._
import util.{Stats, SimpleMap}
@@ -347,6 +348,17 @@ trait Checking {
ctx.error(i"""$called is already implemented by super${caller.superClass},
|its constructor cannot be called again""".stripMargin, call.pos)
}
+
+ /** Check that `tpt` does not define a higher-kinded type */
+ def checkSimpleKinded(tpt: Tree)(implicit ctx: Context): Tree =
+ if (tpt.tpe.isHK && !ctx.compilationUnit.isJava) {
+ // be more lenient with missing type params in Java,
+ // needed to make pos/java-interop/t1196 work.
+ val alias = tpt.tpe.dealias
+ if (alias.isHK) errorTree(tpt, d"missing type parameter for ${tpt.tpe}")
+ else tpt.withType(alias)
+ }
+ else tpt
}
trait NoChecking extends Checking {
@@ -360,4 +372,5 @@ trait NoChecking extends Checking {
override def checkFeasible(tp: Type, pos: Position, where: => String = "")(implicit ctx: Context): Type = tp
override def checkNoDoubleDefs(cls: Symbol)(implicit ctx: Context): Unit = ()
override def checkParentCall(call: Tree, caller: ClassSymbol)(implicit ctx: Context) = ()
+ override def checkSimpleKinded(tpt: Tree)(implicit ctx: Context): Tree = tpt
}
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index 1bd4152e9..fbdfef930 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -370,7 +370,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
if (untpd.isWildcardStarArg(tree))
TypeTree(defn.SeqClass.typeRef.appliedTo(pt :: Nil))
else
- typedType(tree.tpt)
+ checkSimpleKinded(typedType(tree.tpt))
val expr1 =
if (isWildcard) tree.expr withType tpt1.tpe
else typed(tree.expr, tpt1.tpe)
@@ -918,7 +918,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
def typedValDef(vdef: untpd.ValDef, sym: Symbol)(implicit ctx: Context) = track("typedValDef") {
val ValDef(name, tpt, _) = vdef
completeAnnotations(vdef, sym)
- val tpt1 = typedType(tpt)
+ val tpt1 = checkSimpleKinded(typedType(tpt))
val rhs1 = vdef.rhs match {
case rhs @ Ident(nme.WILDCARD) => rhs withType tpt1.tpe
case rhs => typedExpr(rhs, tpt1.tpe)
@@ -932,7 +932,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
val tparams1 = tparams mapconserve (typed(_).asInstanceOf[TypeDef])
val vparamss1 = vparamss nestedMapconserve (typed(_).asInstanceOf[ValDef])
if (sym is Implicit) checkImplicitParamsNotSingletons(vparamss1)
- val tpt1 = typedType(tpt)
+ val tpt1 = checkSimpleKinded(typedType(tpt))
val rhs1 = typedExpr(ddef.rhs, tpt1.tpe)
assignType(cpy.DefDef(ddef)(name, tparams1, vparamss1, tpt1, rhs1), sym)
//todo: make sure dependent method types do not depend on implicits or by-name params