diff options
author | Paul Phillips <paulp@improving.org> | 2009-07-18 15:19:55 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2009-07-18 15:19:55 +0000 |
commit | 1c56489b3e008ffb192443a1627df16f245a6c01 (patch) | |
tree | ef14008ca66967f44c4eadaedb9f33c74d6a5b35 /src | |
parent | 1f6c8f2be985dd24cb47dc1569d7980cf7a0fd2f (diff) | |
download | scala-1c56489b3e008ffb192443a1627df16f245a6c01.tar.gz scala-1c56489b3e008ffb192443a1627df16f245a6c01.tar.bz2 scala-1c56489b3e008ffb192443a1627df16f245a6c01.zip |
Fix and post/neg test cases for #1878.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/TreeInfo.scala | 12 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 4 |
2 files changed, 16 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/TreeInfo.scala b/src/compiler/scala/tools/nsc/ast/TreeInfo.scala index 3d023777f3..3eb6dc321b 100644 --- a/src/compiler/scala/tools/nsc/ast/TreeInfo.scala +++ b/src/compiler/scala/tools/nsc/ast/TreeInfo.scala @@ -276,6 +276,18 @@ abstract class TreeInfo { case _ => false } + /** The underlying pattern ignoring any bindings */ + def unbind(x: Tree): Tree = x match { + case Bind(_, y) => unbind(y) + case y => y + } + + /** Is this tree a Star(_) after removing bindings? */ + def isStar(x: Tree) = unbind(x) match { + case Star(_) => true + case _ => false + } + /** The method part of an application node */ def methPart(tree: Tree): Tree = tree match { diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index b1ed6da208..c2d69637b1 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -1607,6 +1607,10 @@ trait Typers { self: Analyzer => * @return ... */ def typedCase(cdef: CaseDef, pattpe: Type, pt: Type): CaseDef = { + // verify no _* except in last position + for (Apply(_, xs) <- cdef.pat ; x <- xs dropRight 1 ; if treeInfo isStar x) + error(x.pos, "_* may only come last") + val pat1: Tree = typedPattern(cdef.pat, pattpe) val guard1: Tree = if (cdef.guard == EmptyTree) EmptyTree else typed(cdef.guard, BooleanClass.tpe) |