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 | |
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')
-rw-r--r-- | src/dotty/tools/dotc/typer/Implicits.scala | 5 | ||||
-rw-r--r-- | src/dotty/tools/dotc/typer/Mode.scala | 5 |
2 files changed, 8 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) } diff --git a/src/dotty/tools/dotc/typer/Mode.scala b/src/dotty/tools/dotc/typer/Mode.scala index 8889cf604..e84ef2784 100644 --- a/src/dotty/tools/dotc/typer/Mode.scala +++ b/src/dotty/tools/dotc/typer/Mode.scala @@ -68,5 +68,10 @@ object Mode { */ val Printing = newMode(10, "Printing") + /** We are currently typechecking an ident to determine whether some implicit + * is shadowed - don't do any other shadowing tests. + */ + val ImplicitShadowing = newMode(11, "ImplicitShadowing") + val PatternOrType = Pattern | Type } |