Skip to content

Commit

Permalink
Tweak convertible implicits fix (#18727)
Browse files Browse the repository at this point in the history
  • Loading branch information
dwijnand authored Nov 13, 2023
2 parents bd24735 + a175525 commit 85908de
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 2 deletions.
4 changes: 2 additions & 2 deletions compiler/src/dotty/tools/dotc/typer/Implicits.scala
Original file line number Diff line number Diff line change
Expand Up @@ -852,7 +852,7 @@ trait Implicits:
&& !to.isError
&& !ctx.isAfterTyper
&& ctx.mode.is(Mode.ImplicitsEnabled)
&& from.widen.isValueType
&& from.isValueType
&& ( from.isValueSubType(to)
|| inferView(dummyTreeOfType(from), to)
(using ctx.fresh.addMode(Mode.ImplicitExploration).setExploreTyperState()).isSuccess
Expand Down Expand Up @@ -984,7 +984,7 @@ trait Implicits:
.filter { imp =>
!isImplicitDefConversion(imp.underlying)
&& imp.symbol != defn.Predef_conforms
&& viewExists(imp, fail.expectedType)
&& viewExists(imp.underlying.resultType, fail.expectedType)
}
else
Nil
Expand Down
8 changes: 8 additions & 0 deletions tests/neg/i16453b1.check
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
-- [E172] Type Error: tests/neg/i16453b1.scala:11:19 -------------------------------------------------------------------
11 | val ko = get[Int] // error
| ^
|No given instance of type Ctx => Option[Int] was found for parameter fn of method get
|
|Note: implicit conversions are not automatically applied to arguments of using clauses. You will have to pass the argument explicitly.
|The following implicits in scope can be implicitly converted to Ctx => Option[Int]:
|- final lazy given val foo: Ctx => Int
12 changes: 12 additions & 0 deletions tests/neg/i16453b1.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import scala.language.implicitConversions

sealed trait Ctx
given ct[T]: Conversion[Ctx => T, Ctx => Option[T]] = fn => fn.andThen(Option.apply)

def get[T](using fn: Ctx => Option[T]): Option[T] = ???

def Test = {
given foo: (Ctx => Int) = _ => 42
val ok = get[Int](using summon[Ctx => Int])
val ko = get[Int] // error
}
8 changes: 8 additions & 0 deletions tests/neg/i16453b2.check
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
-- [E172] Type Error: tests/neg/i16453b2.scala:11:19 -------------------------------------------------------------------
11 | val ko = get[Int] // error
| ^
|No given instance of type Ctx => Option[Int] was found for parameter fn of method get
|
|Note: implicit conversions are not automatically applied to arguments of using clauses. You will have to pass the argument explicitly.
|The following implicits in scope can be implicitly converted to Ctx => Option[Int]:
|- final given def foo2[A]: Ctx => Int
12 changes: 12 additions & 0 deletions tests/neg/i16453b2.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import scala.language.implicitConversions

sealed trait Ctx
given ct[T]: Conversion[Ctx => T, Ctx => Option[T]] = fn => fn.andThen(Option.apply)

def get[T](using fn: Ctx => Option[T]): Option[T] = ???

def Test = {
given foo2[A]: (Ctx => Int) = _ => 42
val ok = get[Int](using summon[Ctx => Int])
val ko = get[Int] // error
}

0 comments on commit 85908de

Please sign in to comment.