diff options
author | Aleksandar Prokopec <aleksandar@aleksandar-Latitude-E6500.(none)> | 2012-05-08 17:36:20 +0200 |
---|---|---|
committer | Aleksandar Prokopec <aleksandar@aleksandar-Latitude-E6500.(none)> | 2012-05-08 17:36:20 +0200 |
commit | d107527434b6cdf5f3ec6900a9572d6a6e3e5629 (patch) | |
tree | ed7945bb9b3084dd648157a574065b626e080fe1 | |
parent | c4590b799adbd398bb226de5893eb72bba127ed4 (diff) | |
download | scala-d107527434b6cdf5f3ec6900a9572d6a6e3e5629.tar.gz scala-d107527434b6cdf5f3ec6900a9572d6a6e3e5629.tar.bz2 scala-d107527434b6cdf5f3ec6900a9572d6a6e3e5629.zip |
Fixes SI-5564.
Catching typer errors in specialization.
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala | 31 | ||||
-rw-r--r-- | test/files/neg/t5564.check | 4 | ||||
-rw-r--r-- | test/files/neg/t5564.scala (renamed from test/files/pos/t5564.scala) | 0 |
3 files changed, 27 insertions, 8 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala index e0f34b47c8..aea29a27dd 100644 --- a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala +++ b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala @@ -1322,7 +1322,15 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers { else None } else None } - + + def reportError[T](body: =>T)(handler: TypeError => T): T = + try body + catch { + case te: TypeError => + reporter.error(tree.pos, te.msg) + handler(te) + } + curTree = tree tree match { case Apply(Select(New(tpt), nme.CONSTRUCTOR), args) => @@ -1331,11 +1339,10 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers { if (found.typeSymbol ne tpt.tpe.typeSymbol) { // the ctor can be specialized debuglog("** instantiated specialized type: " + found) - try localTyper.typedPos(tree.pos)(New(found, transformTrees(args): _*)) - catch { - case te: TypeError => - reporter.error(tree.pos, te.msg) - super.transform(tree) + reportError { + localTyper.typedPos(tree.pos)(New(found, transformTrees(args): _*)) + } { + _ => super.transform(tree) } } else super.transform(tree) @@ -1493,13 +1500,21 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers { }) debuglog("created special overload tree " + t) debuglog("created " + t) - localTyper.typed(t) + reportError { + localTyper.typed(t) + } { + _ => super.transform(tree) + } case fwd @ Forward(_) => debuglog("forward: " + fwd + ", " + ddef) val rhs1 = forwardCall(tree.pos, gen.mkAttributedRef(symbol.owner.thisType, fwd.target), vparamss) debuglog("-->d completed forwarder to specialized overload: " + fwd.target + ": " + rhs1) - localTyper.typed(deriveDefDef(tree)(_ => rhs1)) + reportError { + localTyper.typed(deriveDefDef(tree)(_ => rhs1)) + } { + _ => super.transform(tree) + } case SpecializedAccessor(target) => val rhs1 = if (symbol.isGetter) diff --git a/test/files/neg/t5564.check b/test/files/neg/t5564.check new file mode 100644 index 0000000000..e7e13ccc9c --- /dev/null +++ b/test/files/neg/t5564.check @@ -0,0 +1,4 @@ +t5564.scala:8: error: inferred type arguments [A] do not conform to method bar's type parameter bounds [B >: A <: C] + def bar[B >: A <: C]: T = throw new Exception + ^ +one error found diff --git a/test/files/pos/t5564.scala b/test/files/neg/t5564.scala index 663cf88726..663cf88726 100644 --- a/test/files/pos/t5564.scala +++ b/test/files/neg/t5564.scala |