summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@typesafe.com>2013-02-12 16:06:19 -0800
committerAdriaan Moors <adriaan.moors@typesafe.com>2013-02-12 16:06:19 -0800
commit76f167388a42e9bb8b72645d87bcb408b6981576 (patch)
tree55b62a8e1bf9d5bc908c757c2fe05e9f26ff1cf2 /src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala
parent14048023a1deba540502da96663deca6ca226bf6 (diff)
parentf51ed74aa3aa142c8aa9d5f9d03e0c244737f66e (diff)
downloadscala-76f167388a42e9bb8b72645d87bcb408b6981576.tar.gz
scala-76f167388a42e9bb8b72645d87bcb408b6981576.tar.bz2
scala-76f167388a42e9bb8b72645d87bcb408b6981576.zip
Merge remote-tracking branch 'scala/2.10.x' into patmat-refactor-master
Conflicts: src/compiler/scala/tools/nsc/typechecker/Implicits.scala
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala b/src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala
index af484a47e2..cfe962d65f 100644
--- a/src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala
@@ -525,17 +525,24 @@ trait TypeDiagnostics {
}
object checkDead {
- private var expr: Symbol = NoSymbol
+ private val exprStack: mutable.Stack[Symbol] = mutable.Stack(NoSymbol)
+ // The method being applied to `tree` when `apply` is called.
+ private def expr = exprStack.top
private def exprOK =
(expr != Object_synchronized) &&
!(expr.isLabel && treeInfo.isSynthCaseSymbol(expr)) // it's okay to jump to matchEnd (or another case) with an argument of type nothing
- private def treeOK(tree: Tree) = tree.tpe != null && tree.tpe.typeSymbol == NothingClass
+ private def treeOK(tree: Tree) = {
+ val isLabelDef = tree match { case _: LabelDef => true; case _ => false}
+ tree.tpe != null && tree.tpe.typeSymbol == NothingClass && !isLabelDef
+ }
- def updateExpr(fn: Tree) = {
- if (fn.symbol != null && fn.symbol.isMethod && !fn.symbol.isConstructor)
- checkDead.expr = fn.symbol
+ @inline def updateExpr[A](fn: Tree)(f: => A) = {
+ if (fn.symbol != null && fn.symbol.isMethod && !fn.symbol.isConstructor) {
+ exprStack push fn.symbol
+ try f finally exprStack.pop()
+ } else f
}
def apply(tree: Tree): Tree = {
// Error suppression will squash some of these warnings unless we circumvent it.