diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/matching/Patterns.scala | 23 | ||||
-rw-r--r-- | test/files/pos/bug3411.scala | 8 |
2 files changed, 14 insertions, 17 deletions
diff --git a/src/compiler/scala/tools/nsc/matching/Patterns.scala b/src/compiler/scala/tools/nsc/matching/Patterns.scala index d35049c1e5..a135655b9d 100644 --- a/src/compiler/scala/tools/nsc/matching/Patterns.scala +++ b/src/compiler/scala/tools/nsc/matching/Patterns.scala @@ -85,7 +85,8 @@ trait Patterns extends ast.TreeDSL { // 8.1.4 (a) case class ApplyIdentPattern(tree: Apply) extends ApplyPattern with NamePattern { - require (!isVarPattern(fn) && args.isEmpty) + // XXX - see bug 3411 for code which violates this assumption + // require (!isVarPattern(fn) && args.isEmpty) val ident @ Ident(name) = fn override def sufficientType = Pattern(ident).equalsCheck @@ -223,24 +224,12 @@ trait Patterns extends ast.TreeDSL { def isSameLength(other: SequenceLikePattern) = nonStarLength == other.nonStarLength } - abstract class SequencePattern extends Pattern with SequenceLikePattern { - val tree: ArrayValue + // 8.1.8 (b) (literal ArrayValues) + case class SequencePattern(tree: ArrayValue) extends Pattern with SequenceLikePattern { lazy val ArrayValue(elemtpt, elems) = tree override def subpatternsForVars: List[Pattern] = elemPatterns - override def description = "Seq(%s)".format(elemPatterns) - } - - // 8.1.8 (b) (literal ArrayValues) - case class SequenceNoStarPattern(tree: ArrayValue) extends SequencePattern { - require(!hasStar) - } - - // 8.1.8 (b) - case class SequenceStarPattern(tree: ArrayValue) extends SequencePattern { - require(hasStar) - - override def description = "Seq*(%s)".format(elemPatterns) + override def description = "Seq(%s)".format(elemPatterns mkString ", ") } // 8.1.8 (c) @@ -299,7 +288,7 @@ trait Patterns extends ast.TreeDSL { case x: Literal => LiteralPattern(x) case x: UnApply => UnapplyPattern(x) case x: Ident => if (isVarPattern(x)) VariablePattern(x) else SimpleIdPattern(x) - case x: ArrayValue => if (isRightIgnoring(x)) SequenceStarPattern(x) else SequenceNoStarPattern(x) + case x: ArrayValue => SequencePattern(x) case x: Select => StableIdPattern(x) case x: Star => StarPattern(x) case x: This => ThisPattern(x) // XXX ? diff --git a/test/files/pos/bug3411.scala b/test/files/pos/bug3411.scala new file mode 100644 index 0000000000..b58e52db8d --- /dev/null +++ b/test/files/pos/bug3411.scala @@ -0,0 +1,8 @@ +object A { + def g(c: PartialFunction[Any,Unit]) {} + + def f { + lazy val x = 0 + g { case `x` => } + } +} |