From 8ed7099f7db6a1060a490a594c958ca9a8b41487 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Mon, 7 Oct 2013 15:06:22 +0200 Subject: SI-7899 Don't infer by-name types during, e.g. eta-expansion Given: def id[A](a: A): A = a def foo(f: (=> Int) => Int) = () foo(id) We eta-expanded `id` and inferred `A` to be `=> Int` to satisfy the expected type set forth by the formal parameter `f`. We really shouldn't go about inferring types that we can't *write*. Our attempt to do so led promptly into a `ClassCastException` in the enclosed test. This commit: - drops by-name-ness during `inferExprInstance` - tests that this results in a type error for the reported bug (neg/t7899) - tests that a method with a by-name parameter can still be eta expanded to match function with a corresponding by-name parameter (run/t7899) - discovers the same latent CCE in pos/t7584 - now that would be a type error - so we compensate by using placeholder functions rather than eta-expansion. - and move that that test to `run` for good measure. --- test/files/neg/t7899.scala | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 test/files/neg/t7899.scala (limited to 'test/files/neg/t7899.scala') diff --git a/test/files/neg/t7899.scala b/test/files/neg/t7899.scala new file mode 100644 index 0000000000..f2dea3ab1f --- /dev/null +++ b/test/files/neg/t7899.scala @@ -0,0 +1,7 @@ +object Test { + def foo[B](f: (=> Int) => B): () => B = () => f(0) + + def main(args: Array[String]) { + foo(identity)() + } +} -- cgit v1.2.3