aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-07-13 15:17:17 +0200
committerMartin Odersky <odersky@gmail.com>2016-07-13 15:33:47 +0200
commit18b30803952cee83580eab28068bc773fdce780e (patch)
tree03c603f0920da2b987d9b93b5b820c099f9049e5 /src
parent0ff5354e2a5e3f29234d6d761177f9228d8da522 (diff)
downloaddotty-18b30803952cee83580eab28068bc773fdce780e.tar.gz
dotty-18b30803952cee83580eab28068bc773fdce780e.tar.bz2
dotty-18b30803952cee83580eab28068bc773fdce780e.zip
Allow hk parameters in lower bounds
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/core/TypeApplications.scala8
-rw-r--r--src/dotty/tools/dotc/core/Types.scala4
-rw-r--r--src/dotty/tools/dotc/typer/Checking.scala12
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala1
4 files changed, 8 insertions, 17 deletions
diff --git a/src/dotty/tools/dotc/core/TypeApplications.scala b/src/dotty/tools/dotc/core/TypeApplications.scala
index db6020e54..ef241cb66 100644
--- a/src/dotty/tools/dotc/core/TypeApplications.scala
+++ b/src/dotty/tools/dotc/core/TypeApplications.scala
@@ -349,7 +349,9 @@ class TypeApplications(val self: Type) extends AnyVal {
case self: TypeAlias =>
self.derivedTypeAlias(expand(self.alias))
case self @ TypeBounds(lo, hi) =>
- self.derivedTypeBounds(lo, expand(hi))
+ self.derivedTypeBounds(
+ if (lo.isRef(defn.NothingClass)) lo else expand(lo),
+ expand(hi))
case _ => expand(self)
}
}
@@ -431,7 +433,7 @@ class TypeApplications(val self: Type) extends AnyVal {
case arg @ TypeAlias(alias) =>
arg.derivedTypeAlias(adaptArg(alias))
case arg @ TypeBounds(lo, hi) =>
- arg.derivedTypeBounds(lo, adaptArg(hi))
+ arg.derivedTypeBounds(adaptArg(lo), adaptArg(hi))
case _ =>
arg
}
@@ -504,7 +506,7 @@ class TypeApplications(val self: Type) extends AnyVal {
case dealiased: TypeAlias =>
dealiased.derivedTypeAlias(dealiased.alias.appliedTo(args))
case dealiased: TypeBounds =>
- dealiased.derivedTypeBounds(dealiased.lo, dealiased.hi.appliedTo(args))
+ dealiased.derivedTypeBounds(dealiased.lo.appliedTo(args), dealiased.hi.appliedTo(args))
case dealiased: LazyRef =>
LazyRef(() => dealiased.ref.appliedTo(args))
case dealiased: WildcardType =>
diff --git a/src/dotty/tools/dotc/core/Types.scala b/src/dotty/tools/dotc/core/Types.scala
index 284e9535e..1bfe9cbd1 100644
--- a/src/dotty/tools/dotc/core/Types.scala
+++ b/src/dotty/tools/dotc/core/Types.scala
@@ -2596,7 +2596,9 @@ object Types {
case resType @ TypeAlias(alias) =>
resType.derivedTypeAlias(duplicate(paramNames, paramBounds, alias))
case resType @ TypeBounds(lo, hi) =>
- resType.derivedTypeBounds(lo, duplicate(paramNames, paramBounds, hi))
+ resType.derivedTypeBounds(
+ if (lo.isRef(defn.NothingClass)) lo else duplicate(paramNames, paramBounds, lo),
+ duplicate(paramNames, paramBounds, hi))
case _ =>
derivedGenericType(paramNames, paramBounds, resType)
}
diff --git a/src/dotty/tools/dotc/typer/Checking.scala b/src/dotty/tools/dotc/typer/Checking.scala
index b37216e6e..9e55216c1 100644
--- a/src/dotty/tools/dotc/typer/Checking.scala
+++ b/src/dotty/tools/dotc/typer/Checking.scala
@@ -534,17 +534,6 @@ trait Checking {
errorTree(tpt, d"missing type parameter for ${tpt.tpe}")
}
else tpt
-
- def checkLowerNotHK(sym: Symbol, tparams: List[Symbol], pos: Position)(implicit ctx: Context) =
- if (tparams.nonEmpty)
- sym.info match {
- case info: TypeAlias => // ok
- case TypeBounds(lo, _) =>
- for (tparam <- tparams)
- if (tparam.typeRef.occursIn(lo))
- ctx.error(i"type parameter ${tparam.name} may not occur in lower bound $lo", pos)
- case _ =>
- }
}
trait NoChecking extends Checking {
@@ -558,5 +547,4 @@ trait NoChecking extends Checking {
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
- override def checkLowerNotHK(sym: Symbol, tparams: List[Symbol], pos: Position)(implicit ctx: Context) = ()
}
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index 62d356e3d..4e2842da7 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -1064,7 +1064,6 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
def typedTypeDef(tdef: untpd.TypeDef, sym: Symbol)(implicit ctx: Context): Tree = track("typedTypeDef") {
val TypeDef(name, rhs) = tdef
- checkLowerNotHK(sym, tdef.tparams.map(symbolOfTree), tdef.pos)
completeAnnotations(tdef, sym)
assignType(cpy.TypeDef(tdef)(name, typedType(rhs), Nil), sym)
}