summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/transform/Erasure.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-12-11 19:36:18 +0100
committerJason Zaugg <jzaugg@gmail.com>2013-12-11 19:36:18 +0100
commit44ccf7fc30faeaca9e325453268bd443add01e49 (patch)
tree27f68b8bd88e15b81792a78fa504f7dfb18a4d4d /src/compiler/scala/tools/nsc/transform/Erasure.scala
parentceeab40611dde9183e7a8de32b7eba87ef133094 (diff)
parenta774157a4b666f29b7cd4bd958ea1ac150380959 (diff)
downloadscala-44ccf7fc30faeaca9e325453268bd443add01e49.tar.gz
scala-44ccf7fc30faeaca9e325453268bd443add01e49.tar.bz2
scala-44ccf7fc30faeaca9e325453268bd443add01e49.zip
Merge commit 'a774157' into merge/2.10.x-to-master
Conflicts: src/compiler/scala/tools/nsc/transform/Erasure.scala
Diffstat (limited to 'src/compiler/scala/tools/nsc/transform/Erasure.scala')
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala
index 6fe0f34105..6732900ef2 100644
--- a/src/compiler/scala/tools/nsc/transform/Erasure.scala
+++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala
@@ -714,11 +714,24 @@ abstract class Erasure extends AddInterfaces
/** TODO - adapt SymbolPairs so it can be used here. */
private def checkNoDeclaredDoubleDefs(base: Symbol) {
val decls = base.info.decls
+
+ // SI-8010 force infos, otherwise makeNotPrivate in ExplicitOuter info transformer can trigger
+ // a scope rehash while were iterating and we can see the same entry twice!
+ // Inspection of SymbolPairs (the basis of OverridingPairs), suggests that it is immune
+ // from this sort of bug as it copies the symbols into a temporary scope *before* any calls to `.info`,
+ // ie, no variant of it calls `info` or `tpe` in `SymbolPair#exclude`.
+ //
+ // Why not just create a temporary scope here? We need to force the name changes in any case before
+ // we do these checks, so that we're comparing same-named methods based on the expanded names that actually
+ // end up in the bytecode.
+ exitingPostErasure(decls.foreach(_.info))
+
var e = decls.elems
while (e ne null) {
if (e.sym.isTerm) {
var e1 = decls lookupNextEntry e
while (e1 ne null) {
+ assert(e.sym ne e1.sym, s"Internal error: encountered ${e.sym.debugLocationString} twice during scope traversal. This might be related to SI-8010.")
if (sameTypeAfterErasure(e.sym, e1.sym))
doubleDefError(new SymbolPair(base, e.sym, e1.sym))