Skip to content

Commit 9d19ef6

Browse files
committed
Merge pull request #1078 from dotty-staging/fix-#324
Better handling enclosing class computations
2 parents 13b6165 + 34d11c5 commit 9d19ef6

File tree

5 files changed

+21
-2
lines changed

5 files changed

+21
-2
lines changed

src/dotty/tools/dotc/typer/Implicits.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,8 @@ trait Implicits { self: Typer =>
402402
|| (to isRef defn.ObjectClass)
403403
|| (to isRef defn.UnitClass)
404404
|| (from.tpe isRef defn.NothingClass)
405-
|| (from.tpe isRef defn.NullClass)) NoImplicitMatches
405+
|| (from.tpe isRef defn.NullClass)
406+
|| (from.tpe eq NoPrefix)) NoImplicitMatches
406407
else
407408
try inferImplicit(to.stripTypeVar.widenExpr, from, from.pos)
408409
catch {

src/dotty/tools/dotc/typer/TypeAssigner.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import Scopes._, Contexts._, Constants._, Types._, Symbols._, Names._, Flags._,
88
import ErrorReporting._, Annotations._, Denotations._, SymDenotations._, StdNames._, TypeErasure._
99
import util.Positions._
1010
import config.Printers._
11+
import NameOps._
1112

1213
trait TypeAssigner {
1314
import tpd._
@@ -16,7 +17,11 @@ trait TypeAssigner {
1617
* @param packageOk The qualifier may refer to a package.
1718
*/
1819
def qualifyingClass(tree: untpd.Tree, qual: Name, packageOK: Boolean)(implicit ctx: Context): Symbol = {
19-
def qualifies(sym: Symbol) = sym.isClass && (qual.isEmpty || sym.name == qual)
20+
def qualifies(sym: Symbol) =
21+
sym.isClass && (
22+
qual.isEmpty ||
23+
sym.name == qual ||
24+
sym.is(Module) && sym.name.stripModuleClassSuffix == qual)
2025
ctx.outersIterator.map(_.owner).find(qualifies) match {
2126
case Some(c) if packageOK || !(c is Package) =>
2227
c

test/dotc/tests.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ class tests extends CompilerTest {
155155
@Test def neg_i0091_infpaths = compileFile(negDir, "i0091-infpaths", xerrors = 3)
156156
@Test def neg_i0248_inherit_refined = compileFile(negDir, "i0248-inherit-refined", xerrors = 4)
157157
@Test def neg_i0281 = compileFile(negDir, "i0281-null-primitive-conforms", xerrors = 3)
158+
@Test def neg_i324 = compileFile(negDir, "i324", xerrors = 2)
158159
@Test def neg_i583 = compileFile(negDir, "i0583-skolemize", xerrors = 2)
159160
@Test def neg_i941 = compileFile(negDir, "i941", xerrors = 3)
160161
@Test def neg_finalSealed = compileFile(negDir, "final-sealed", xerrors = 2)

tests/neg/i324.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class O
2+
object O {
3+
val x: this.type = OO.this
4+
val y: O = OO.this
5+
}

tests/pos/i324.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class O
2+
object O {
3+
val x: this.type = O.this
4+
}
5+
object O2 {
6+
val x: this.type = O2.this
7+
}

0 commit comments

Comments
 (0)