aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-05-01 09:23:53 +0200
committerMartin Odersky <odersky@gmail.com>2016-05-18 19:43:21 +0200
commitcc0f62954e814200f47f978b857abf6ab039c9f0 (patch)
tree5b96f412e1f8a91426dbc81ca387e8b2ebb942b5 /src/dotty/tools/dotc
parentf36c21ed9f79a1fc41e36d7c5221a070d83e61a7 (diff)
downloaddotty-cc0f62954e814200f47f978b857abf6ab039c9f0.tar.gz
dotty-cc0f62954e814200f47f978b857abf6ab039c9f0.tar.bz2
dotty-cc0f62954e814200f47f978b857abf6ab039c9f0.zip
Don't copy Any constructor to Object in Erasure
Once we do not merge methods with same signature anymore we got an ambiguous overload between the constructors of Any and Object after erasure (when all Any methods are moved to Object). To avoid this, we map the Any constructor to the Object constructor after erasure.
Diffstat (limited to 'src/dotty/tools/dotc')
-rw-r--r--src/dotty/tools/dotc/transform/Erasure.scala12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/dotty/tools/dotc/transform/Erasure.scala b/src/dotty/tools/dotc/transform/Erasure.scala
index 0b3a07f65..ee8040168 100644
--- a/src/dotty/tools/dotc/transform/Erasure.scala
+++ b/src/dotty/tools/dotc/transform/Erasure.scala
@@ -41,13 +41,19 @@ class Erasure extends Phase with DenotTransformer { thisTransformer =>
// Aftre erasure, all former Any members are now Object members
val ClassInfo(pre, _, ps, decls, selfInfo) = ref.info
val extendedScope = decls.cloneScope
- defn.AnyClass.classInfo.decls.foreach(extendedScope.enter)
+ for (decl <- defn.AnyClass.classInfo.decls)
+ if (!decl.isConstructor) extendedScope.enter(decl)
ref.copySymDenotation(
info = transformInfo(ref.symbol,
ClassInfo(pre, defn.ObjectClass, ps, extendedScope, selfInfo))
)
}
else {
+ val oldSymbol = ref.symbol
+ val newSymbol =
+ if ((oldSymbol.owner eq defn.AnyClass) && oldSymbol.isConstructor)
+ defn.ObjectClass.primaryConstructor
+ else oldSymbol
val oldOwner = ref.owner
val newOwner = if (oldOwner eq defn.AnyClass) defn.ObjectClass else oldOwner
val oldInfo = ref.info
@@ -55,10 +61,10 @@ class Erasure extends Phase with DenotTransformer { thisTransformer =>
val oldFlags = ref.flags
val newFlags = ref.flags &~ Flags.HasDefaultParams // HasDefaultParams needs to be dropped because overriding might become overloading
// TODO: define derivedSymDenotation?
- if ((oldOwner eq newOwner) && (oldInfo eq newInfo) && (oldFlags == newFlags)) ref
+ if ((oldSymbol eq newSymbol) && (oldOwner eq newOwner) && (oldInfo eq newInfo) && (oldFlags == newFlags)) ref
else {
assert(!ref.is(Flags.PackageClass), s"trans $ref @ ${ctx.phase} oldOwner = $oldOwner, newOwner = $newOwner, oldInfo = $oldInfo, newInfo = $newInfo ${oldOwner eq newOwner} ${oldInfo eq newInfo}")
- ref.copySymDenotation(owner = newOwner, initFlags = newFlags, info = newInfo)
+ ref.copySymDenotation(symbol = newSymbol, owner = newOwner, initFlags = newFlags, info = newInfo)
}
}
case ref =>