From 510f63778011060a8d912085b7248ef69e4217f8 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Sun, 13 May 2012 17:47:00 +0200 Subject: SI-5318 Make implicit divergence checking PolyType aware. Replaces the two active subclasses of `SymCollector` with direct use of traversal methods of `Type`. Wildcard free class type parameters, not just method type parameters, when stripping the core type of candidate implicits. The spec doesn't make any such distinction, and the enclosed test, t5318c, crashes without this change. --- test/files/neg/t5318.check | 5 +++++ test/files/neg/t5318.scala | 8 ++++++++ test/files/neg/t5318b.check | 5 +++++ test/files/neg/t5318b.scala | 8 ++++++++ test/files/neg/t5318c.check | 5 +++++ test/files/neg/t5318c.scala | 14 ++++++++++++++ 6 files changed, 45 insertions(+) create mode 100644 test/files/neg/t5318.check create mode 100644 test/files/neg/t5318.scala create mode 100644 test/files/neg/t5318b.check create mode 100644 test/files/neg/t5318b.scala create mode 100644 test/files/neg/t5318c.check create mode 100644 test/files/neg/t5318c.scala (limited to 'test/files/neg') diff --git a/test/files/neg/t5318.check b/test/files/neg/t5318.check new file mode 100644 index 0000000000..d6a3a57935 --- /dev/null +++ b/test/files/neg/t5318.check @@ -0,0 +1,5 @@ +t5318.scala:7: error: diverging implicit expansion for type CompilerHang.this.TC[F] +starting with method tc in class CompilerHang + breakage // type checker doesn't terminate, should report inference failure + ^ +one error found diff --git a/test/files/neg/t5318.scala b/test/files/neg/t5318.scala new file mode 100644 index 0000000000..8009c66e6b --- /dev/null +++ b/test/files/neg/t5318.scala @@ -0,0 +1,8 @@ +class CompilerHang { + trait TC[M[_]] + trait S[A] + + implicit def tc[M[_]](implicit M0: TC[M]): TC[S] = null + def breakage[F[_] : TC] = 0 + breakage // type checker doesn't terminate, should report inference failure +} \ No newline at end of file diff --git a/test/files/neg/t5318b.check b/test/files/neg/t5318b.check new file mode 100644 index 0000000000..47a10d6733 --- /dev/null +++ b/test/files/neg/t5318b.check @@ -0,0 +1,5 @@ +t5318b.scala:7: error: diverging implicit expansion for type DivergingImplicitReported.this.TC[F] +starting with method tc in class DivergingImplicitReported + breakage // correct: diverging implicit expansion + ^ +one error found \ No newline at end of file diff --git a/test/files/neg/t5318b.scala b/test/files/neg/t5318b.scala new file mode 100644 index 0000000000..123f8b4e04 --- /dev/null +++ b/test/files/neg/t5318b.scala @@ -0,0 +1,8 @@ +class DivergingImplicitReported { + trait TC[M] + trait S + + implicit def tc[M](implicit M0: TC[M]): TC[S] = null + def breakage[F: TC] = 0 + breakage // correct: diverging implicit expansion +} \ No newline at end of file diff --git a/test/files/neg/t5318c.check b/test/files/neg/t5318c.check new file mode 100644 index 0000000000..594539be69 --- /dev/null +++ b/test/files/neg/t5318c.check @@ -0,0 +1,5 @@ +t5318c.scala:13: error: diverging implicit expansion for type CompilerHang.this.TC[F] +starting with method tc in class CompilerHang + breakage // type checker doesn't terminate, should report inference failure + ^ +one error found diff --git a/test/files/neg/t5318c.scala b/test/files/neg/t5318c.scala new file mode 100644 index 0000000000..477a9874ad --- /dev/null +++ b/test/files/neg/t5318c.scala @@ -0,0 +1,14 @@ +class CompilerHang { + trait TC[M[_]] + trait S[A] + + class C[M[_]] { + type TCM = TC[M] + } + + // A nefarious implicit, to motivate the removal of `&& sym.owner.isTerm` from + // `isFreeTypeParamNoSkolem`. + implicit def tc[x[_], CC[x[_]] <: C[x]](implicit M0: CC[x]#TCM): CC[x]#TCM = null + def breakage[F[_] : TC] = 0 + breakage // type checker doesn't terminate, should report inference failure +} -- cgit v1.2.3