diff options
author | Martin Odersky <odersky@gmail.com> | 2015-12-19 18:58:56 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-12-19 18:59:40 +0100 |
commit | aad036c4720aac43a41ab8d994d51d71d233031d (patch) | |
tree | 29de864037fb135981c61176e3f2614dabc4c4d6 | |
parent | 7dafb2ac6d5fd41cfc0a94f2a72b881987890abf (diff) | |
download | dotty-aad036c4720aac43a41ab8d994d51d71d233031d.tar.gz dotty-aad036c4720aac43a41ab8d994d51d71d233031d.tar.bz2 dotty-aad036c4720aac43a41ab8d994d51d71d233031d.zip |
Don't flag override errors for synthetic companion objects.
-rw-r--r-- | src/dotty/tools/dotc/typer/RefChecks.scala | 9 | ||||
-rw-r--r-- | tests/pos/t6335.scala | 25 |
2 files changed, 32 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/typer/RefChecks.scala b/src/dotty/tools/dotc/typer/RefChecks.scala index 00518278c..7ccb3d103 100644 --- a/src/dotty/tools/dotc/typer/RefChecks.scala +++ b/src/dotty/tools/dotc/typer/RefChecks.scala @@ -211,7 +211,7 @@ object RefChecks { if (!(hasErrors && member.is(Synthetic) && member.is(Module))) { // suppress errors relating toi synthetic companion objects if other override // errors (e.g. relating to the companion class) have already been reported. - if (member.owner == clazz) ctx.error(fullmsg, member.pos) + if (member.owner == clazz) ctx.error(fullmsg+", member = $member", member.pos) else mixinOverrideErrors += new MixinOverrideError(member, fullmsg) hasErrors = true } @@ -221,6 +221,11 @@ object RefChecks { emitOverrideError(overrideErrorMsg(msg)) } + def autoOverride(sym: Symbol) = + sym.is(Synthetic) && ( + desugar.isDesugaredCaseClassMethodName(member.name) || // such names are added automatically, can't have an override preset. + sym.is(Module)) // synthetic companion + def overrideAccessError() = { ctx.log(i"member: ${member.showLocated} ${member.flags}") // DEBUG ctx.log(i"other: ${other.showLocated} ${other.flags}") // DEBUG @@ -300,7 +305,7 @@ object RefChecks { !member.isAnyOverride) { // (*) Exclusion for default getters, fixes SI-5178. We cannot assign the Override flag to // the default getter: one default getter might sometimes override, sometimes not. Example in comment on ticket. - if (member.is(Synthetic) && desugar.isDesugaredCaseClassMethodName(member.name)) // such names are added automatically, can't have an override preset. + if (autoOverride(member)) member.setFlag(Override) else if (member.owner != clazz && other.owner != clazz && !(other.owner derivesFrom member.owner)) emitOverrideError( diff --git a/tests/pos/t6335.scala b/tests/pos/t6335.scala new file mode 100644 index 000000000..eb052db19 --- /dev/null +++ b/tests/pos/t6335.scala @@ -0,0 +1,25 @@ +object E extends Z { + def X = 3 + implicit class X(val i: Int) { + def xx = i + } + + def Y(a: Any) = 0 + object Y + implicit class Y(val i: String) { def yy = i } + + implicit class Z(val i: Boolean) { def zz = i } +} + +trait Z { + def Z = 0 +} + +object Test { + import E._ + 0.xx + + "".yy + + true.zz +} |