diff options
author | Paul Phillips <paulp@improving.org> | 2011-10-15 21:59:37 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-10-15 21:59:37 +0000 |
commit | 5575b8c36859bc5d5f3a33b4491b98eed0260b8a (patch) | |
tree | 624b16e2f9aae20f1c36c0639c1227b770c47a48 | |
parent | 5690452698acafe6e4843bb08a14f6ca1cc55f8a (diff) | |
download | scala-5575b8c36859bc5d5f3a33b4491b98eed0260b8a.tar.gz scala-5575b8c36859bc5d5f3a33b4491b98eed0260b8a.tar.bz2 scala-5575b8c36859bc5d5f3a33b4491b98eed0260b8a.zip |
Harden the typer against surprise unapply types.
Closes SI-5078, no review.
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 5 | ||||
-rw-r--r-- | test/files/neg/t5078.check | 13 | ||||
-rw-r--r-- | test/files/neg/t5078.scala | 11 |
3 files changed, 28 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 0ecb8efea8..7373501951 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -2588,7 +2588,7 @@ trait Typers extends Modes with Adaptations { if (args.length > MaxTupleArity) error(fun.pos, "too many arguments for unapply pattern, maximum = "+MaxTupleArity) - def freshArgType(tp: Type): (Type, List[Symbol]) = (tp: @unchecked) match { + def freshArgType(tp: Type): (Type, List[Symbol]) = tp match { case MethodType(param :: _, _) => (param.tpe, Nil) case PolyType(tparams, restype) => @@ -2597,6 +2597,9 @@ trait Typers extends Modes with Adaptations { case OverloadedType(_, _) => error(fun.pos, "cannot resolve overloaded unapply") (ErrorType, Nil) + case _ => + error(fun.pos, "an unapply method must accept a single argument.") + (ErrorType, Nil) } val unapp = unapplyMember(otpe) diff --git a/test/files/neg/t5078.check b/test/files/neg/t5078.check new file mode 100644 index 0000000000..8f66445b03 --- /dev/null +++ b/test/files/neg/t5078.check @@ -0,0 +1,13 @@ +t5078.scala:7: error: an unapply method must accept a single argument. + val Foo(x1) = 1 + ^ +t5078.scala:7: error: recursive value x1 needs type + val Foo(x1) = 1 + ^ +t5078.scala:8: error: an unapply method must accept a single argument. + val Foo2(y2) = 2 + ^ +t5078.scala:8: error: recursive value y2 needs type + val Foo2(y2) = 2 + ^ +four errors found diff --git a/test/files/neg/t5078.scala b/test/files/neg/t5078.scala new file mode 100644 index 0000000000..2e727e773d --- /dev/null +++ b/test/files/neg/t5078.scala @@ -0,0 +1,11 @@ +object Foo { def unapply: Option[Int] = Some(42) } +object Foo2 { def unapply(): Option[Int] = Some(42) } + + +object Test { + def main(args: Array[String]): Unit = { + val Foo(x1) = 1 + val Foo2(y2) = 2 + () + } +} |