Skip to content

Commit 71e9e21

Browse files
authored
Merge pull request #9575 from dotty-staging/fix-#9568
Fix #9568: Disallow partially undefined types as byname anchors
2 parents f4dfc7d + 0b4c2af commit 71e9e21

File tree

5 files changed

+52
-7
lines changed

5 files changed

+52
-7
lines changed

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -247,11 +247,9 @@ object Implicits:
247247
candidates += Candidate(ref, ckind, level)
248248

249249
if considerExtension then
250-
val tryExtension = tryCandidate(extensionOnly = true)
251-
companionRefs.foreach(tryExtension)
250+
companionRefs.foreach(tryCandidate(extensionOnly = true))
252251
if refs.nonEmpty then
253-
val tryGiven = tryCandidate(extensionOnly = false)
254-
refs.foreach(tryGiven)
252+
refs.foreach(tryCandidate(extensionOnly = false))
255253
candidates.toList
256254
}
257255
}
@@ -1373,6 +1371,7 @@ trait Implicits:
13731371
if cand1.ref eq cand.ref then
13741372
lazy val wildTp = wildApprox(tp.widenExpr)
13751373
if belowByname && (wildTp <:< wildPt) then
1374+
fullyDefinedType(tp, "by-name implicit parameter", span)
13761375
false
13771376
else if prev.typeSize > ptSize || prev.coveringSet != ptCoveringSet then
13781377
loop(outer, tp.isByName || belowByname)

tests/neg/i3452.scala

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@ object Test {
66
implicit def case1[F[_]](implicit t: => TC[F[Any]]): TC[Tuple2K[[_] =>> Any, F, Any]] = ???
77
implicit def case2[A, F[_]](implicit r: TC[F[Any]]): TC[A] = ???
88

9-
// Disabled because it leads to an infinite loop in implicit search
10-
// this is probably the same issue as https://github.com/lampepfl/dotty/issues/9568
11-
// implicitly[TC[Int]] // was: error
9+
implicitly[TC[Int]] // typechecks because we infer F := Nothing (should we avoid inferring Nothing for higher-kinded types?)
1210
}
1311

1412
object Test1 {

tests/neg/i9568.check

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-- Error: tests/neg/i9568.scala:13:10 ----------------------------------------------------------------------------------
2+
13 | blaMonad.foo(bla) // error: diverges
3+
| ^
4+
|no implicit argument of type => Monad[([_$3] =>> Any)] was found for parameter ev of method blaMonad in object Test.
5+
|I found:
6+
|
7+
| Test.blaMonad[Nothing, S](Test.blaMonad[F, S])
8+
|
9+
|But method blaMonad in object Test does not match type => Monad[Nothing].

tests/neg/i9568.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
trait Monad[F[_]] {
2+
def foo[A](fa: F[A]): Unit = {}
3+
}
4+
5+
class Bla[F[_], A]
6+
7+
object Test {
8+
type Id[A] = A
9+
10+
val bla: Bla[Id, Unit] = ???
11+
implicit def blaMonad[F[_], S](implicit ev: => Monad[F]): Monad[({type L[X] = Bla[F, X]})#L] = ???
12+
13+
blaMonad.foo(bla) // error: diverges
14+
}

tests/pos/i9568.scala

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
trait Monad[F[_]] {
2+
def foo[A](fa: F[A]): Unit = {}
3+
}
4+
5+
class Bla[F[_], A]
6+
7+
object Test1 {
8+
type Id[A] = A
9+
10+
val bla: Bla[Id, Unit] = ???
11+
implicit def blaMonad[F[_]: Monad, S]: Monad[({type L[X] = Bla[F, X]})#L] = ???
12+
implicit def idMonad: Monad[Id] = ???
13+
14+
blaMonad.foo(bla) // does not diverge
15+
}
16+
17+
object Test2 {
18+
type Id[A] = A
19+
20+
val bla: Bla[Id, Unit] = ???
21+
implicit def blaMonad[F[_], S](implicit ev: => Monad[F]): Monad[({type L[X] = Bla[F, X]})#L] = ???
22+
implicit def idMonad: Monad[Id] = ???
23+
24+
blaMonad.foo(bla) // does not diverge
25+
}

0 commit comments

Comments
 (0)