summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala2
-rw-r--r--test/pending/pos/unapplyNeedsMemberType.scala25
2 files changed, 27 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index fdf221b951..52096ffbcd 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -585,6 +585,8 @@ trait Typers requires Analyzer {
}
if (definitions.unapplyMember(consp.tpe).exists)
atPos(tree.pos) {Ident(consp).setType(consp.tpe)}
+ // needs member type, but member of what? ^^^
+ // see test/pending/pos/unapplyNeedsMemberType.scala
else errorTree(tree, "" + clazz + " is not a case class, nor does it have unapply/unapplySeq method")
} else {
errorTree(tree, "" + clazz + " is neither a case class nor a sequence class")
diff --git a/test/pending/pos/unapplyNeedsMemberType.scala b/test/pending/pos/unapplyNeedsMemberType.scala
new file mode 100644
index 0000000000..b423257e04
--- /dev/null
+++ b/test/pending/pos/unapplyNeedsMemberType.scala
@@ -0,0 +1,25 @@
+// error with -Xunapply, (because of missing call to memberType?)
+
+trait Gunk[a] {
+
+ type Seq
+
+ object Cons {
+ def unapply(s: Seq) = unapply_Cons(s)
+ }
+ def unapply_Cons(s: Any): Option[Tuple2[a, Seq]]
+}
+
+class Join[a] extends Gunk[a] {
+ type Seq = JoinSeq
+
+ abstract class JoinSeq
+ case class App(xs: Seq, ys: Seq) extends JoinSeq
+
+ def append(s1: Seq, s2: Seq): Seq = s1 // mock implementation
+
+ def unapply_Cons(s: Any) = s match {
+ case App(Cons(x, xs), ys) => Some(Pair(x, append(xs, ys)))
+ case _ => null
+ }
+}