diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Infer.scala | 4 | ||||
-rw-r--r-- | test/files/neg/t4457_1.check | 7 | ||||
-rw-r--r-- | test/files/neg/t4457_1.scala | 33 | ||||
-rw-r--r-- | test/files/neg/t4457_2.check | 13 | ||||
-rw-r--r-- | test/files/neg/t4457_2.scala | 33 | ||||
-rw-r--r-- | test/files/pos/t4457_1.scala | 26 |
6 files changed, 115 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Infer.scala b/src/compiler/scala/tools/nsc/typechecker/Infer.scala index fd27f178ef..0b1a9f6187 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Infer.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Infer.scala @@ -1568,7 +1568,9 @@ trait Infer { (alts map pre.memberType) +", argtpes = "+ argtpes +", pt = "+ pt) var allApplicable = alts filter (alt => - isApplicable(undetparams, followApply(pre.memberType(alt)), argtpes, pt)) + // TODO: this will need to be re-written once we substitute throwing exceptions + // with generating error trees. We wrap this applicability in try/catch because of #4457. + try {isApplicable(undetparams, followApply(pre.memberType(alt)), argtpes, pt)} catch {case _: TypeError => false}) //log("applicable: "+ (allApplicable map pre.memberType)) diff --git a/test/files/neg/t4457_1.check b/test/files/neg/t4457_1.check new file mode 100644 index 0000000000..c6b83c6ce5 --- /dev/null +++ b/test/files/neg/t4457_1.check @@ -0,0 +1,7 @@ +t4457_1.scala:27: error: ambiguous reference to overloaded definition, +both method aFunc in object ImplicitConvAmbiguity2 of type [A](a: ImplicitConvAmbiguity2.NZ[A])ImplicitConvAmbiguity2.AA[Float] +and method aFunc in object ImplicitConvAmbiguity2 of type [A](a: ImplicitConvAmbiguity2.NE[A])ImplicitConvAmbiguity2.AA[A] +match argument types (Float) + val x = aFunc(4F) + ^ +one error found diff --git a/test/files/neg/t4457_1.scala b/test/files/neg/t4457_1.scala new file mode 100644 index 0000000000..11f12379f6 --- /dev/null +++ b/test/files/neg/t4457_1.scala @@ -0,0 +1,33 @@ +object ImplicitConvAmbiguity2 { + + class N[T] + class NE[T] extends N[T] + class NN[T] extends N[T] + class NQ[T] extends N[T] + class NZ[T] extends N[T] + class AA[A] + class BB[A] + + implicit def conv1(i: Float) = new NE[Float] + implicit def conv3(op: AA[java.util.TooManyListenersException]) = new N[java.util.TooManyListenersException] + implicit def conv4(op: AA[Float]) = new N[Float] + implicit def conv7(i: Float) = new NZ[Float] + implicit def conv5(e: BB[java.util.GregorianCalendar]) = new N[java.util.GregorianCalendar] + + // These two will be in conflict in typeMe1 + def aFunc[A](a: NE[A]) = new AA[A] + def aFunc[A](a: NZ[A]) = new AA[Float] + + def aFunc[A](a: NN[A]) = new BB[A] + def aFunc[A](a: NQ[A]) = new BB[A] + + def bFunc[T](e1: N[T]) = {} + + def typeMe1 { + val x = aFunc(4F) + bFunc(x) + } + def typeMe2 { + bFunc(aFunc(4F)) + } +} diff --git a/test/files/neg/t4457_2.check b/test/files/neg/t4457_2.check new file mode 100644 index 0000000000..770a355395 --- /dev/null +++ b/test/files/neg/t4457_2.check @@ -0,0 +1,13 @@ +t4457_2.scala:27: error: ambiguous reference to overloaded definition, +both method aFunc in object ImplicitConvAmbiguity2 of type [A](a: ImplicitConvAmbiguity2.NZ[A])ImplicitConvAmbiguity2.AA[A] +and method aFunc in object ImplicitConvAmbiguity2 of type [A](a: ImplicitConvAmbiguity2.NE[A])ImplicitConvAmbiguity2.AA[A] +match argument types (Float) + val x = aFunc(4F) + ^ +t4457_2.scala:31: error: ambiguous reference to overloaded definition, +both method aFunc in object ImplicitConvAmbiguity2 of type [A](a: ImplicitConvAmbiguity2.NZ[A])ImplicitConvAmbiguity2.AA[A] +and method aFunc in object ImplicitConvAmbiguity2 of type [A](a: ImplicitConvAmbiguity2.NE[A])ImplicitConvAmbiguity2.AA[A] +match argument types (Float) + bFunc(aFunc(4F)) + ^ +two errors found diff --git a/test/files/neg/t4457_2.scala b/test/files/neg/t4457_2.scala new file mode 100644 index 0000000000..f3a170f1f2 --- /dev/null +++ b/test/files/neg/t4457_2.scala @@ -0,0 +1,33 @@ +object ImplicitConvAmbiguity2 { + + class N[T] + class NE[T] extends N[T] + class NN[T] extends N[T] + class NQ[T] extends N[T] + class NZ[T] extends N[T] + class AA[A] + class BB[A] + + implicit def conv1(i: Float) = new NE[Float] + implicit def conv3(op: AA[java.util.TooManyListenersException]) = new N[java.util.TooManyListenersException] + implicit def conv4(op: AA[Float]) = new N[Float] + implicit def conv7(i: Float) = new NZ[Float] + implicit def conv5(e: BB[java.util.GregorianCalendar]) = new N[java.util.GregorianCalendar] + + def aFunc[A](a: NE[A]) = new AA[A] + def aFunc[A](a: NZ[A]) = new AA[A] + + def aFunc[A](a: NN[A]) = new BB[A] + + def aFunc[A](a: NQ[A]) = new BB[A] + + def bFunc[T](e1: N[T]) = {} + + def typeMe2 { + val x = aFunc(4F) + bFunc(x) + } + def typeMe1 { + bFunc(aFunc(4F)) + } +} diff --git a/test/files/pos/t4457_1.scala b/test/files/pos/t4457_1.scala new file mode 100644 index 0000000000..32edd6cfdc --- /dev/null +++ b/test/files/pos/t4457_1.scala @@ -0,0 +1,26 @@ +object ImplicitConvAmbiguity2 { + + class N[T] + class NE[T] extends N[T] + class NN[T] extends N[T] + class AA[A] + class BB[A] + + implicit def conv1(i: Float) = new NE[Float] + implicit def conv3(op: AA[java.util.TooManyListenersException]) = new N[java.util.TooManyListenersException] + implicit def conv4(op: AA[Float]) = new N[Float] + implicit def conv5(e: BB[java.util.GregorianCalendar]) = new N[java.util.GregorianCalendar] + + def aFunc[A](a: NE[A]) = new AA[A] + def aFunc[A](a: NN[A]) = new BB[A] + + def bFunc[T](e1: N[T]) = {} + + def typeMe1 { + val x = aFunc(4F) + bFunc(x) + } + def typeMe2 { + bFunc(aFunc(4F)) + } +} |