diff options
author | Hubert Plociniczak <hubert.plociniczak@gmail.com> | 2012-06-27 15:43:44 +0200 |
---|---|---|
committer | Hubert Plociniczak <hubert.plociniczak@gmail.com> | 2012-07-02 14:44:43 +0200 |
commit | 12b72485d873534bcce0b0564c99d89d6b1aa964 (patch) | |
tree | 35fded7d09ae48e053f580d6dff11323cd92f26e /src/compiler | |
parent | 5a7bbfe035ecb64acd57fc66ea0d874ad02c31ff (diff) | |
download | scala-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.scala | 7 |
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) } |