diff --git a/compiler/src/dotty/tools/dotc/typer/ImportSuggestions.scala b/compiler/src/dotty/tools/dotc/typer/ImportSuggestions.scala index 7615fbda9f0a..33643a0fae2f 100644 --- a/compiler/src/dotty/tools/dotc/typer/ImportSuggestions.scala +++ b/compiler/src/dotty/tools/dotc/typer/ImportSuggestions.scala @@ -158,7 +158,7 @@ trait ImportSuggestions: // Candidates that are already available without explicit import because they // are already provided by the context (imported or inherited) or because they // are in the implicit scope of `pt`. - val alreadyAvailableCandidates: Set[Symbol] = { + lazy val alreadyAvailableCandidates: Set[Symbol] = { val wildProto = wildApprox(pt) val contextualCandidates = ctx.implicits.eligible(wildProto) val implicitScopeCandidates = ctx.run.nn.implicitScope(wildProto).eligible diff --git a/compiler/src/dotty/tools/dotc/typer/Typer.scala b/compiler/src/dotty/tools/dotc/typer/Typer.scala index 1903b3d6f019..ade395f835ca 100644 --- a/compiler/src/dotty/tools/dotc/typer/Typer.scala +++ b/compiler/src/dotty/tools/dotc/typer/Typer.scala @@ -720,9 +720,11 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer val elems = qual.tpe.widenTermRefExpr.tupleElementTypes.getOrElse(Nil) typedSelect(tree, pt, qual.cast(defn.tupleType(elems))) else - val tree1 = tryExtensionOrConversion( + val tree1 = { + if selName.isTypeName then EmptyTree + else tryExtensionOrConversion( tree, pt, IgnoredProto(pt), qual, ctx.typerState.ownedVars, this, inSelect = true) - .orElse { + }.orElse { if ctx.gadt.isNarrowing then // try GADT approximation if we're trying to select a member // Member lookup cannot take GADTs into account b/c of cache, so we diff --git a/tests/neg/i11994.check b/tests/neg/i11994.check index 76860af70a39..fcb49fe3411d 100644 --- a/tests/neg/i11994.check +++ b/tests/neg/i11994.check @@ -1,26 +1,8 @@ -- [E008] Not Found Error: tests/neg/i11994.scala:2:28 ----------------------------------------------------------------- 2 |implicit def foo[T <: Tuple.meow]: Unit = ??? // error | ^^^^^^^^^^ - | type meow is not a member of object Tuple. - | Extension methods were tried, but the search failed with: - | - | Cyclic reference involving method foo - | - | The error occurred while trying to compute the signature of method foo - | which required to compute the signature of type T - | which required to compute the signature of method foo - | - | Run with both -explain-cyclic and -Ydebug-cyclic to see full stack trace. + | type meow is not a member of object Tuple -- [E008] Not Found Error: tests/neg/i11994.scala:3:18 ----------------------------------------------------------------- 3 |given [T <: Tuple.meow]: Unit = ??? // error | ^^^^^^^^^^ - | type meow is not a member of object Tuple. - | Extension methods were tried, but the search failed with: - | - | Cyclic reference involving method given_Unit - | - | The error occurred while trying to compute the signature of given instance given_Unit - | which required to compute the signature of type T - | which required to compute the signature of given instance given_Unit - | - | Run with both -explain-cyclic and -Ydebug-cyclic to see full stack trace. + | type meow is not a member of object Tuple diff --git a/tests/neg/i19888.scala b/tests/neg/i19888.scala new file mode 100644 index 000000000000..d258672feed6 --- /dev/null +++ b/tests/neg/i19888.scala @@ -0,0 +1,16 @@ +object Main{ + object Foo + object Bar{ type Qux = Unit } + + + implicit def conv(f: Foo.type): Bar.type = Bar + + def B: Bar.type = Bar + + def main(args: Array[String]): Unit = { + val x: Foo.Qux = null // error + val y: B.Qux = null + println(x) + println(y) + } +} \ No newline at end of file