summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-09-25 23:06:56 -0700
committerPaul Phillips <paulp@improving.org>2012-09-26 08:07:58 -0700
commit25d03629d87861640fc9d56d4378b985dfb7efd3 (patch)
treeeaa4f0a259e98181c23fa31c6dc9a1583cf18173 /src/compiler
parent9904301752c2aa8c8509f1bcd6108f626220524a (diff)
downloadscala-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.
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/scala/tools/nsc/transform/UnCurry.scala5
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Checkable.scala9
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"""