summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorHubert Plociniczak <hubert.plociniczak@gmail.com>2012-06-27 15:43:44 +0200
committerHubert Plociniczak <hubert.plociniczak@gmail.com>2012-07-02 14:44:43 +0200
commit12b72485d873534bcce0b0564c99d89d6b1aa964 (patch)
tree35fded7d09ae48e053f580d6dff11323cd92f26e /src/compiler
parent5a7bbfe035ecb64acd57fc66ea0d874ad02c31ff (diff)
downloadscala-12b72485d873534bcce0b0564c99d89d6b1aa964.tar.gz
scala-12b72485d873534bcce0b0564c99d89d6b1aa964.tar.bz2
scala-12b72485d873534bcce0b0564c99d89d6b1aa964.zip
Closes SI-5969.
Assumption that we enter tryTwice when inferring the right alternative with an empty buffer is wrong. In this particular bug it manifested itself on if/then/else which share the same context and 'else' branch was simply flushing the buffer with an error from the 'then' branch.
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Infer.scala7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Infer.scala b/src/compiler/scala/tools/nsc/typechecker/Infer.scala
index 688dcd91ac..e1aabb5469 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Infer.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Infer.scala
@@ -1612,6 +1612,9 @@ trait Infer {
val saved = context.state
var fallback = false
context.setBufferErrors()
+ // Need to test first attempt with an empty buffer.
+ // Otherwise, any previous errors will get lost.
+ val errorsToRestore = context.flushAndReturnBuffer()
try {
context.withImplicitsDisabled(infer(false))
if (context.hasErrors) {
@@ -1625,8 +1628,10 @@ trait Infer {
case ex: TypeError => // recoverable cyclic references
context.restoreState(saved)
if (!fallback) infer(true) else ()
+ } finally {
+ context.restoreState(saved)
+ context.updateBuffer(errorsToRestore)
}
- context.restoreState(saved)
}
else infer(true)
}