summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksandar Prokopec <aleksandar@aleksandar-Latitude-E6500.(none)>2012-05-08 17:36:20 +0200
committerAleksandar Prokopec <aleksandar@aleksandar-Latitude-E6500.(none)>2012-05-08 17:36:20 +0200
commitd107527434b6cdf5f3ec6900a9572d6a6e3e5629 (patch)
treeed7945bb9b3084dd648157a574065b626e080fe1
parentc4590b799adbd398bb226de5893eb72bba127ed4 (diff)
downloadscala-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.scala31
-rw-r--r--test/files/neg/t5564.check4
-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