diff options
author | Paul Phillips <paulp@improving.org> | 2012-09-25 23:06:56 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-09-26 08:07:58 -0700 |
commit | 25d03629d87861640fc9d56d4378b985dfb7efd3 (patch) | |
tree | eaa4f0a259e98181c23fa31c6dc9a1583cf18173 | |
parent | 9904301752c2aa8c8509f1bcd6108f626220524a (diff) | |
download | scala-25d03629d87861640fc9d56d4378b985dfb7efd3.tar.gz scala-25d03629d87861640fc9d56d4378b985dfb7efd3.tar.bz2 scala-25d03629d87861640fc9d56d4378b985dfb7efd3.zip |
Annotate non local returns with @unchecked.
Newly available @unchecked annotation enables removing the
special case from the unchecked logic.
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/UnCurry.scala | 5 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Checkable.scala | 9 |
2 files changed, 4 insertions, 10 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala index 5a3db26e30..d3a5cebea0 100644 --- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala +++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala @@ -185,7 +185,7 @@ abstract class UnCurry extends InfoTransform * try { * body * } catch { - * case ex: NonLocalReturnControl[_] => + * case ex: NonLocalReturnControl[T @unchecked] => * if (ex.key().eq(key)) ex.value() * else throw ex * } @@ -195,7 +195,8 @@ abstract class UnCurry extends InfoTransform localTyper typed { val extpe = nonLocalReturnExceptionType(meth.tpe.finalResultType) val ex = meth.newValue(nme.ex, body.pos) setInfo extpe - val pat = gen.mkBindForCase(ex, NonLocalReturnControlClass, List(meth.tpe.finalResultType)) + val argType = meth.tpe.finalResultType withAnnotation (AnnotationInfo marker UncheckedClass.tpe) + val pat = gen.mkBindForCase(ex, NonLocalReturnControlClass, List(argType)) val rhs = ( IF ((ex DOT nme.key)() OBJ_EQ Ident(key)) THEN ((ex DOT nme.value)()) diff --git a/src/compiler/scala/tools/nsc/typechecker/Checkable.scala b/src/compiler/scala/tools/nsc/typechecker/Checkable.scala index 5363abbae9..763d209dd0 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Checkable.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Checkable.scala @@ -79,7 +79,6 @@ trait Checkable { sym.isTypeParameterOrSkolem // dummy || (sym.name.toTermName == nme.WILDCARD) // _ || nme.isVariableName(sym.name) // type variable - || (sym == NonLocalReturnControlClass) // synthetic ) private def isUnwarnableTypeArg(arg: Type) = ( isUnwarnableTypeArgSymbol(arg.typeSymbolDirect) // has to be direct: see pos/t1439 @@ -97,19 +96,13 @@ trait Checkable { tps filterNot isUnwarnableTypeArg } - private def isReifiableArray(tp: Type): Boolean = tp match { - case TypeRef(_, ArrayClass, arg :: Nil) => isReifiableArray(arg) - case TypeRef(_, sym, args) => isUnwarnableTypeArg(tp) || (!sym.isAbstractType && args.isEmpty) - case _ => false - } - private class CheckabilityChecker(val X: Type, val P: Type) { def Xsym = X.typeSymbol def Psym = P.typeSymbol def XR = propagateKnownTypes(X, Psym) def P1 = X matchesPattern P def P2 = CheckabilityChecker.isNeverSubType(X, P) - def P3 = Psym.isClass && ((XR matchesPattern P) || isReifiableArray(P) || P.typeArgs.forall(isUnwarnableTypeArg)) + def P3 = Psym.isClass && (XR matchesPattern P) def P4 = !(P1 || P2 || P3) def summaryString = f""" |