closes #4044. kind checking ignored trailing higher-order arguments. no review

git-svn-id: http://lampsvn.epfl.ch/svn-repos/scala/scala/trunk@23900 5e8d7ff9-d8ef-0310-90f0-a4852d11357a
This commit is contained in:
moors 2011-01-05 09:35:16 +00:00
parent fb5299a2b6
commit 37276f74b7
3 changed files with 33 additions and 1 deletions

View File

@ -5486,7 +5486,7 @@ A type's typeSymbol should never be inspected directly.
def stricterBounds(as: Iterable[(Symbol, Symbol)]) { if(explainErrors) _stricterBounds ++= as }
for ((hkarg, hkparam) <- hkargs zip hkparams) {
if (hkparam.typeParams.isEmpty) { // base-case: kind *
if (hkparam.typeParams.isEmpty && hkarg.typeParams.isEmpty) { // base-case: kind *
if (!variancesMatch(hkarg, hkparam))
varianceMismatch(hkarg, hkparam)

View File

@ -0,0 +1,16 @@
t4044.scala:9: error: AnyRef takes no type parameters, expected: one
M[AnyRef] // error, (AnyRef :: *) not kind-conformant to (N :: * -> * -> *)
^
t4044.scala:9: error: kinds of the type arguments (<error>) do not conform to the expected kinds of the type parameters (type N).
<error>'s type parameters do not match type N's expected parameters: <none> has no type parameters, but type N has one
M[AnyRef] // error, (AnyRef :: *) not kind-conformant to (N :: * -> * -> *)
^
t4044.scala:11: error: kinds of the type arguments (Test.A) do not conform to the expected kinds of the type parameters (type N).
Test.A's type parameters do not match type N's expected parameters: type _ has no type parameters, but type O has one
M[A] // error, (A :: (* -> *) not kind-conformant to (N :: * -> * -> *)
^
t4044.scala:15: error: kinds of the type arguments (Test.C) do not conform to the expected kinds of the type parameters (type N).
Test.C's type parameters do not match type N's expected parameters: type _ has one type parameter, but type _ has none
M[C] // error, (C :: (* -> * -> * -> *) not kind-conformant to (N :: * -> * -> *)
^
four errors found

View File

@ -0,0 +1,16 @@
object Test {
def M[N[O[_]]] = ()
type A[_] = Any
type B[_[_]] = Any
type C[_[_[_]]] = Any
M[Any] // okay, Any is kind overloaded.
M[AnyRef] // error, (AnyRef :: *) not kind-conformant to (N :: * -> * -> *)
M[A] // error, (A :: (* -> *) not kind-conformant to (N :: * -> * -> *)
M[B] // okay, (B :: (* -> * -> *) is kind-conformant to (N :: * -> * -> *)
M[C] // error, (C :: (* -> * -> * -> *) not kind-conformant to (N :: * -> * -> *)
}