diff options
author | Martin Odersky <odersky@gmail.com> | 2016-07-13 15:17:17 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2016-07-13 15:33:47 +0200 |
commit | 18b30803952cee83580eab28068bc773fdce780e (patch) | |
tree | 03c603f0920da2b987d9b93b5b820c099f9049e5 | |
parent | 0ff5354e2a5e3f29234d6d761177f9228d8da522 (diff) | |
download | dotty-18b30803952cee83580eab28068bc773fdce780e.tar.gz dotty-18b30803952cee83580eab28068bc773fdce780e.tar.bz2 dotty-18b30803952cee83580eab28068bc773fdce780e.zip |
Allow hk parameters in lower bounds
-rw-r--r-- | src/dotty/tools/dotc/core/TypeApplications.scala | 8 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/Types.scala | 4 | ||||
-rw-r--r-- | src/dotty/tools/dotc/typer/Checking.scala | 12 | ||||
-rw-r--r-- | src/dotty/tools/dotc/typer/Typer.scala | 1 | ||||
-rw-r--r-- | tests/neg/hklower.scala | 11 | ||||
-rw-r--r-- | tests/neg/hklower2.scala | 4 | ||||
-rw-r--r-- | tests/pos/hklower.scala | 11 |
7 files changed, 23 insertions, 28 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) } diff --git a/tests/neg/hklower.scala b/tests/neg/hklower.scala deleted file mode 100644 index e1e79070e..000000000 --- a/tests/neg/hklower.scala +++ /dev/null @@ -1,11 +0,0 @@ -class Test { // error: conflicting bounds - - type T[X] // OK - type U[X] = T[X] // OK - - type V[X] >: T[X] // error - type W[X] >: T[X] <: T[X] // error - - def f[C[X] >: T[X]]() = ??? // error - -} diff --git a/tests/neg/hklower2.scala b/tests/neg/hklower2.scala new file mode 100644 index 000000000..8268bf09f --- /dev/null +++ b/tests/neg/hklower2.scala @@ -0,0 +1,4 @@ +class Test { // error: conflicting bounds + trait T[X] + type Z[X] >: String <: T[X] +} diff --git a/tests/pos/hklower.scala b/tests/pos/hklower.scala new file mode 100644 index 000000000..033ee3a34 --- /dev/null +++ b/tests/pos/hklower.scala @@ -0,0 +1,11 @@ +class Test { // error: conflicting bounds + + type T[X] + type U[X] = T[X] + + type V[X] >: T[X] + type W[X] >: T[X] <: T[X] + + def f[C[X] >: T[X]]() = ??? + +} |