Skip to content

Commit

Permalink
Don't allow implicit conversions on prefixes of type selections (#19934)
Browse files Browse the repository at this point in the history
Fixes #19888
  • Loading branch information
odersky authored Mar 14, 2024
2 parents a74470c + b5cff57 commit 3d5cf9c
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 4 additions & 2 deletions compiler/src/dotty/tools/dotc/typer/Typer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
22 changes: 2 additions & 20 deletions tests/neg/i11994.check
Original file line number Diff line number Diff line change
@@ -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
16 changes: 16 additions & 0 deletions tests/neg/i19888.scala
Original file line number Diff line number Diff line change
@@ -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)
}
}

0 comments on commit 3d5cf9c

Please sign in to comment.