diff options
author | Martin Odersky <odersky@gmail.com> | 2012-08-29 12:01:41 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2012-08-29 12:02:25 +0200 |
commit | 35dbc88841e25ca70b68ac78d5b3e4ab0f23153c (patch) | |
tree | 35d8bdc5b44d15d2f31468c465e612e5fa4c56b8 /src | |
parent | 3313b3049c810909465d5ae60664852610e6834c (diff) | |
download | scala-35dbc88841e25ca70b68ac78d5b3e4ab0f23153c.tar.gz scala-35dbc88841e25ca70b68ac78d5b3e4ab0f23153c.tar.bz2 scala-35dbc88841e25ca70b68ac78d5b3e4ab0f23153c.zip |
Closes SI-6227
I added some general hook where one can add validation code before a name conflict involving at least one implicit symbol is reported.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Namers.scala | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index 77d1260564..adced9d8c9 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -192,6 +192,10 @@ trait Namers extends MethodSynthesis { if (!allowsOverload(sym)) { val prev = scope.lookupEntry(sym.name) if ((prev ne null) && prev.owner == scope && conflict(sym, prev.sym)) { + if (sym.isSynthetic || prev.sym.isSynthetic) { + handleSyntheticNameConflict(sym, prev.sym) + handleSyntheticNameConflict(prev.sym, sym) + } DoubleDefError(sym, prev.sym) sym setInfo ErrorType scope unlink prev.sym // let them co-exist... @@ -202,6 +206,14 @@ trait Namers extends MethodSynthesis { scope enter sym } + /** Logic to handle name conflicts of synthetically generated symbols + * We handle right now: t6227 + */ + def handleSyntheticNameConflict(sym1: Symbol, sym2: Symbol) = { + if (sym1.isImplicit && sym1.isMethod && sym2.isModule && sym2.companionClass.isCaseClass) + validate(sym2.companionClass) + } + def enterSym(tree: Tree): Context = { def dispatch() = { var returnContext = this.context @@ -1390,6 +1402,7 @@ trait Namers extends MethodSynthesis { fail(ImplicitAtToplevel) } if (sym.isClass) { + checkNoConflict(IMPLICIT, CASE) if (sym.isAnyOverride && !sym.hasFlag(TRAIT)) fail(OverrideClass) } else { |