summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@epfl.ch>2011-10-20 22:28:50 +0000
committerAdriaan Moors <adriaan.moors@epfl.ch>2011-10-20 22:28:50 +0000
commitdd8706fc1190909552fd5a84c3e311aaa2e80466 (patch)
tree12c9127d536d6c2ee4861f7fffd1a5d0d0009a96
parent3921e5be742ff9523825037056e82b7b82db5932 (diff)
downloadscala-dd8706fc1190909552fd5a84c3e311aaa2e80466.tar.gz
scala-dd8706fc1190909552fd5a84c3e311aaa2e80466.tar.bz2
scala-dd8706fc1190909552fd5a84c3e311aaa2e80466.zip
5033: align bound syms when comparing method types
can't believe I missed that one... closes SI-5033 more complete test case to make sure the multi-arglist case works as well no review
-rw-r--r--src/compiler/scala/reflect/internal/Types.scala10
-rw-r--r--test/files/pos/t5033.scala15
2 files changed, 19 insertions, 6 deletions
diff --git a/src/compiler/scala/reflect/internal/Types.scala b/src/compiler/scala/reflect/internal/Types.scala
index 1f238d666a..d86fc40bcb 100644
--- a/src/compiler/scala/reflect/internal/Types.scala
+++ b/src/compiler/scala/reflect/internal/Types.scala
@@ -3303,7 +3303,6 @@ A type's typeSymbol should never be inspected directly.
variance = -variance
val result1 = this(result)
if ((params1 eq params) && (result1 eq result)) tp
- // for new dependent types: result1.substSym(params, params1)?
else copyMethodType(tp, params1, result1.substSym(params, params1))
case PolyType(tparams, result) =>
variance = -variance
@@ -4558,9 +4557,8 @@ A type's typeSymbol should never be inspected directly.
case mt1: MethodType =>
tp2 match {
case mt2: MethodType =>
- // DEPMETTODO new dependent types: probably fix this, use substSym as done for PolyType
return isSameTypes(mt1.paramTypes, mt2.paramTypes) &&
- mt1.resultType =:= mt2.resultType &&
+ mt1.resultType =:= mt2.resultType.substSym(mt2.params, mt1.params) &&
mt1.isImplicit == mt2.isImplicit
// note: no case NullaryMethodType(restpe) => return mt1.params.isEmpty && mt1.resultType =:= restpe
case _ =>
@@ -4913,7 +4911,7 @@ A type's typeSymbol should never be inspected directly.
val res2 = mt2.resultType
(sameLength(params1, params2) &&
matchingParams(params1, params2, mt1.isJava, mt2.isJava) &&
- (res1 <:< res2) &&
+ (res1 <:< res2.substSym(params2, params1)) &&
mt1.isImplicit == mt2.isImplicit)
// TODO: if mt1.params.isEmpty, consider NullaryMethodType?
case _ =>
@@ -5033,9 +5031,9 @@ A type's typeSymbol should never be inspected directly.
case mt1 @ MethodType(params1, res1) =>
tp2 match {
case mt2 @ MethodType(params2, res2) =>
- sameLength(params1, params2) && // useful pre-screening optimization
+ // sameLength(params1, params2) was used directly as pre-screening optimization (now done by matchesQuantified -- is that ok, performancewise?)
+ matchesQuantified(params1, params2, res1, res2) &&
matchingParams(params1, params2, mt1.isJava, mt2.isJava) &&
- matchesType(res1, res2, alwaysMatchSimple) &&
mt1.isImplicit == mt2.isImplicit
case NullaryMethodType(res2) =>
if (params1.isEmpty) matchesType(res1, res2, alwaysMatchSimple)
diff --git a/test/files/pos/t5033.scala b/test/files/pos/t5033.scala
new file mode 100644
index 0000000000..c4c3334852
--- /dev/null
+++ b/test/files/pos/t5033.scala
@@ -0,0 +1,15 @@
+trait Eater {
+ type Food[T]
+}
+
+trait Fruit {
+ type Seed
+}
+
+trait PipExtractor {
+ def extract(a: Fruit)(b: Eater): b.Food[a.Seed]
+}
+
+trait LaserGuidedPipExtractor extends PipExtractor {
+ def extract(f: Fruit)(g: Eater): g.Food[f.Seed]
+} \ No newline at end of file