diff options
-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 |