diff options
author | Adriaan Moors <adriaan.moors@epfl.ch> | 2012-07-02 02:28:40 -0700 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@epfl.ch> | 2012-07-02 02:28:40 -0700 |
commit | d14d8178fa39961951d7dd74a37994db86a13063 (patch) | |
tree | 10c3bd0c18da7c2036d254f10e5e6e1e8b20146f /src/reflect | |
parent | 2d68576e91a0dc5a2a119ef2df68458a0e139ce3 (diff) | |
parent | ad51d8295388c02ca9160177aaba1b7e490eb5c2 (diff) | |
download | scala-d14d8178fa39961951d7dd74a37994db86a13063.tar.gz scala-d14d8178fa39961951d7dd74a37994db86a13063.tar.bz2 scala-d14d8178fa39961951d7dd74a37994db86a13063.zip |
Merge pull request #802 from retronym/ticket/5489
SI-5489 Avoid accidentally adding members to Object in erasure.
Diffstat (limited to 'src/reflect')
-rw-r--r-- | src/reflect/scala/reflect/internal/Symbols.scala | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/src/reflect/scala/reflect/internal/Symbols.scala b/src/reflect/scala/reflect/internal/Symbols.scala index a3893a0236..79041924a8 100644 --- a/src/reflect/scala/reflect/internal/Symbols.scala +++ b/src/reflect/scala/reflect/internal/Symbols.scala @@ -1438,24 +1438,28 @@ trait Symbols extends api.Symbols { self: SymbolTable => */ def classBound: Type = { val tp = refinedType(info.parents, owner) - val thistp = tp.typeSymbol.thisType - val oldsymbuf = new ListBuffer[Symbol] - val newsymbuf = new ListBuffer[Symbol] - for (sym <- info.decls) { - // todo: what about public references to private symbols? - if (sym.isPublic && !sym.isConstructor) { - oldsymbuf += sym - newsymbuf += ( - if (sym.isClass) - tp.typeSymbol.newAbstractType(sym.name.toTypeName, sym.pos).setInfo(sym.existentialBound) - else - sym.cloneSymbol(tp.typeSymbol)) + // SI-4589 refinedType only creates a new refinement class symbol before erasure; afterwards + // the first parent class is returned, to which we must not add members. + if (!phase.erasedTypes) { + val thistp = tp.typeSymbol.thisType + val oldsymbuf = new ListBuffer[Symbol] + val newsymbuf = new ListBuffer[Symbol] + for (sym <- info.decls) { + // todo: what about public references to private symbols? + if (sym.isPublic && !sym.isConstructor) { + oldsymbuf += sym + newsymbuf += ( + if (sym.isClass) + tp.typeSymbol.newAbstractType(sym.name.toTypeName, sym.pos).setInfo(sym.existentialBound) + else + sym.cloneSymbol(tp.typeSymbol)) + } + } + val oldsyms = oldsymbuf.toList + val newsyms = newsymbuf.toList + for (sym <- newsyms) { + addMember(thistp, tp, sym modifyInfo (_ substThisAndSym(this, thistp, oldsyms, newsyms))) } - } - val oldsyms = oldsymbuf.toList - val newsyms = newsymbuf.toList - for (sym <- newsyms) { - addMember(thistp, tp, sym modifyInfo (_ substThisAndSym(this, thistp, oldsyms, newsyms))) } tp } |