diff options
author | Martin Odersky <odersky@gmail.com> | 2015-06-18 10:31:48 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-06-19 11:35:22 +0200 |
commit | 06690117f3b67d947df5ef14cd02a55341b94d1c (patch) | |
tree | e3df807760b938a83179cdceda6944cd9196b43c /src/dotty/tools/dotc/typer/Implicits.scala | |
parent | 05e81c1548be6b350111982d7d166046a1665ff8 (diff) | |
download | dotty-06690117f3b67d947df5ef14cd02a55341b94d1c.tar.gz dotty-06690117f3b67d947df5ef14cd02a55341b94d1c.tar.bz2 dotty-06690117f3b67d947df5ef14cd02a55341b94d1c.zip |
Fix stack overflow when testing for shadowing
Shadowing tests could go into an infinite recursion when
the found sahdwoing member itself needs an implicit that
is resolved and then shadowed again by the same member.
A test case is neg/arrayclone-new.scala. This caused
a SO before, now gives two errors.
Diffstat (limited to 'src/dotty/tools/dotc/typer/Implicits.scala')
-rw-r--r-- | src/dotty/tools/dotc/typer/Implicits.scala | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/typer/Implicits.scala b/src/dotty/tools/dotc/typer/Implicits.scala index b03bcfcf9..841390ef1 100644 --- a/src/dotty/tools/dotc/typer/Implicits.scala +++ b/src/dotty/tools/dotc/typer/Implicits.scala @@ -491,7 +491,7 @@ trait Implicits { self: Typer => pt) val generated1 = adapt(generated, pt) lazy val shadowing = - typed(untpd.Ident(ref.name) withPos pos.toSynthetic, funProto)(nestedContext.setNewTyperState) + typed(untpd.Ident(ref.name) withPos pos.toSynthetic, funProto)(nestedContext.setNewTyperState.addMode(Mode.ImplicitShadowing)) def refMatches(shadowing: Tree): Boolean = ref.symbol == closureBody(shadowing).symbol || { shadowing match { @@ -501,7 +501,8 @@ trait Implicits { self: Typer => } if (ctx.typerState.reporter.hasErrors) nonMatchingImplicit(ref) - else if (contextual && !shadowing.tpe.isError && !refMatches(shadowing)) { + else if (contextual && !ctx.mode.is(Mode.ImplicitShadowing) && + !shadowing.tpe.isError && !refMatches(shadowing)) { implicits.println(i"SHADOWING $ref in ${ref.termSymbol.owner} is shadowed by $shadowing in ${shadowing.symbol.owner}") shadowedImplicit(ref, methPart(shadowing).tpe) } |