From 25d03629d87861640fc9d56d4378b985dfb7efd3 Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Tue, 25 Sep 2012 23:06:56 -0700 Subject: Annotate non local returns with @unchecked. Newly available @unchecked annotation enables removing the special case from the unchecked logic. --- src/compiler/scala/tools/nsc/transform/UnCurry.scala | 5 +++-- src/compiler/scala/tools/nsc/typechecker/Checkable.scala | 9 +-------- 2 files changed, 4 insertions(+), 10 deletions(-) (limited to 'src/compiler') 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""" -- cgit v1.2.3