Skip to content

Commit 8b8177e

Browse files
committed
Record failures to adapt application arguments
1 parent dde69ce commit 8b8177e

14 files changed

+93
-34
lines changed

compiler/src/dotty/tools/dotc/core/OrderingConstraint.scala

+3-1
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,8 @@ class OrderingConstraint(private val boundsMap: ParamBounds,
344344
if newSet.isEmpty then deps.remove(referenced)
345345
else deps.updated(referenced, newSet)
346346

347-
def traverse(t: Type) = t match
347+
def traverse(t: Type) = try
348+
t match
348349
case param: TypeParamRef =>
349350
if hasBounds(param) then
350351
if variance >= 0 then coDeps = update(coDeps, param)
@@ -356,6 +357,7 @@ class OrderingConstraint(private val boundsMap: ParamBounds,
356357
seen += tp
357358
traverse(tp.ref)
358359
case _ => traverseChildren(t)
360+
catch case ex: Throwable => handleRecursive("adjust", t.show, ex)
359361
end Adjuster
360362

361363
/** Adjust dependencies to account for the delta of previous entry `prevEntry`

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -779,7 +779,9 @@ trait Applications extends Compatibility {
779779
init()
780780

781781
def addArg(arg: Tree, formal: Type): Unit =
782-
typedArgBuf += adapt(arg, formal.widenExpr)
782+
val arg1 = adapt(arg, formal.widenExpr)
783+
typedArgBuf += arg1
784+
ok = ok && !arg1.tpe.isError
783785

784786
def makeVarArg(n: Int, elemFormal: Type): Unit = {
785787
val args = typedArgBuf.takeRight(n).toList

tests/neg/enum-values.check

+4-4
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
|
2525
| failed with:
2626
|
27-
| Found: Array[example.Tag[?]]
28-
| Required: Array[example.ListLike[?]]
27+
| Found: example.ListLike.type
28+
| Required: Nothing
2929
-- [E008] Not Found Error: tests/neg/enum-values.scala:34:52 -----------------------------------------------------------
3030
34 | val typeCtorsK: Array[TypeCtorsK[?]] = TypeCtorsK.values // error
3131
| ^^^^^^^^^^^^^^^^^
@@ -38,8 +38,8 @@
3838
|
3939
| failed with:
4040
|
41-
| Found: Array[example.Tag[?]]
42-
| Required: Array[example.TypeCtorsK[?[_$1]]]
41+
| Found: example.TypeCtorsK.type
42+
| Required: Nothing
4343
-- [E008] Not Found Error: tests/neg/enum-values.scala:36:6 ------------------------------------------------------------
4444
36 | Tag.valueOf("Int") // error
4545
| ^^^^^^^^^^^

tests/neg/enumsAccess.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ object test5 {
6363
enum E5[T](x: T) {
6464
case C3() extends E5[INT](defaultX)// error: illegal reference // error: illegal reference
6565
case C4 extends E5[INT](defaultX) // error: illegal reference // error: illegal reference
66-
case C5 extends E5[E5[_]](E5.this) // error: type mismatch
66+
case C5 extends E5[E5[_]](E5.this) // error: cannot be instantiated // error: conflicting base types // error: type mismatch
6767
}
6868

6969
object E5 {

tests/neg/i1430.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ object Test {
55

66
val y: List[List[String]] = List(List(1)) // error: found Int(1), expected: String
77

8-
val z: (List[String], List[Int]) = (List(1), List("a")) // error: found Int(1), expected: String // error: found String(a), expected: Int
8+
val z: (List[String], List[Int]) = (List(1), List("a")) // error: found Int(1), expected: String
99

1010
val a: Inv[String] = new Inv(new Inv(1)) // error: found Inv[T], expected: String ... where T ...
1111

tests/neg/i15525.scala

+11-11
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,14 @@ def element22(
4040
def test22 =
4141
Resolution(
4242
element22(
43-
Resolution(element0), Resolution(element0), // error // error
44-
Resolution(element0), Resolution(element0), // error // error
45-
Resolution(element0), Resolution(element0), // error // error
46-
Resolution(element0), Resolution(element0), // error // error
47-
Resolution(element0), Resolution(element0), // error // error
48-
Resolution(element0), Resolution(element0), // error // error
49-
Resolution(element0), Resolution(element0), // error // error
50-
Resolution(element0), Resolution(element0), // error // error
51-
Resolution(element0), Resolution(element0), // error // error
52-
Resolution(element0), Resolution(element0), // error // error
53-
Resolution(element0), Resolution(element0)))// error // error
43+
Resolution(element0), Resolution(element0), // error
44+
Resolution(element0), Resolution(element0),
45+
Resolution(element0), Resolution(element0),
46+
Resolution(element0), Resolution(element0),
47+
Resolution(element0), Resolution(element0),
48+
Resolution(element0), Resolution(element0),
49+
Resolution(element0), Resolution(element0),
50+
Resolution(element0), Resolution(element0),
51+
Resolution(element0), Resolution(element0),
52+
Resolution(element0), Resolution(element0),
53+
Resolution(element0), Resolution(element0)))

tests/neg/i3083.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
def expression(adder: Addition) = {
1313
import adder.*
14-
add(num(1), num(2)) // error // error (not found: num)
14+
add(num(1), num(2)) // error (not found: num)
1515
}
1616
}
1717

tests/neg/i6779.check

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
| value f is not a member of T.
1212
| An extension method was tried, but could not be fully constructed:
1313
|
14-
| Test.f[G[T]](x)(given_Stuff)
14+
| Test.f[G[T]](x)
1515
|
1616
| failed with:
1717
|

tests/neg/i9160.scala

+5-5
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ object Test {
1111
e10: F[T], e11: F[T], e12: F[T],
1212
) = ???
1313
f("foo")(
14-
F, F, F, // error // error // error
15-
F, F, F, // error // error // error
16-
F, F, F, // error // error // error
17-
F, F, F, // error // error // error
14+
F, F, F, // error
15+
F, F, F,
16+
F, F, F,
17+
F, F, F,
1818
)
1919
}
2020

@@ -128,4 +128,4 @@ trait Implicits {
128128
given g98 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F]: G[Int] = ???
129129
given g99 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F]: G[Int] = ???
130130
given g100 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F]: G[Int] = ???
131-
}
131+
}

tests/neg/recursive-lower-constraint.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ class Bar extends Foo[Bar]
33

44
class A {
55
def foo[T <: Foo[T], U >: Foo[T] <: T](x: T): T = x
6-
foo(new Bar) // error
6+
foo(new Bar) // error // error
77
}

tests/neg/syntax-error-recovery.check

-6
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,6 @@
9494
| Not found: bam
9595
|
9696
| longer explanation available when compiling with `-explain`
97-
-- [E006] Not Found Error: tests/neg/syntax-error-recovery.scala:61:10 -------------------------------------------------
98-
61 | println(bam) // error
99-
| ^^^
100-
| Not found: bam
101-
|
102-
| longer explanation available when compiling with `-explain`
10397
-- [E129] Potential Issue Warning: tests/neg/syntax-error-recovery.scala:7:2 -------------------------------------------
10498
6 | 2
10599
7 | }

tests/neg/syntax-error-recovery.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,5 +58,5 @@ object Test2:
5858
def foo5(x: Int) =
5959
foo2(foo2(,) // error // error
6060

61-
println(bam) // error
61+
println(bam)
6262
// error

tests/pos/i18163.orig.scala

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import scala.language.implicitConversions
2+
3+
// We do have 2 `contramap` functions, one provided via `LoggerSyntax` other via `Contravariant.Ops`
4+
// `ContravariantMonoidal` given instances are not used, and they do not match our type. Code fails when we have at least 2 instances of them
5+
// Removal of `import catsSyntax._` allow to compile code
6+
// Removal of `import odinSyntax.LoggerSyntax` and remaining `catsSyntax` would fail to compile the `def fails`
7+
8+
trait Foo[A]
9+
trait Bar[A]
10+
11+
trait WriterT[F[_]: Contravariant, L, V]:
12+
def contramap[Z](fn: Z => V): WriterT[F, L, Z] = ???
13+
trait Logger[F[_]]
14+
class WriterTLogger[F[_]] extends Logger[[G] =>> WriterT[F, List[String], G]]
15+
16+
trait ContravariantMonoidal[F[_]] extends Invariant[F] with Contravariant[F]
17+
trait Invariant[F[_]]
18+
object Invariant:
19+
given ContravariantMonoidal[Foo] = ???
20+
given ContravariantMonoidal[Bar] = ???
21+
22+
trait Contravariant[F[_]] extends Invariant[F]
23+
object Contravariant:
24+
trait Ops[F[_], A]:
25+
def contramap[B](f: B => A): F[B] = ???
26+
27+
object catsSyntax:
28+
implicit def toContravariantOps[F[_]: Contravariant, A](target: F[A]): Contravariant.Ops[F, A] = ???
29+
30+
object odinSyntax:
31+
implicit class LoggerSyntax[F[_]](logger: Logger[F]):
32+
def contramap(f: String => String): Logger[F] = ???
33+
34+
import catsSyntax._
35+
import odinSyntax.LoggerSyntax
36+
37+
class Test:
38+
def fails = new WriterTLogger[Option].contramap(identity)
39+
def works = LoggerSyntax(new WriterTLogger[Option]).contramap(identity)
40+

tests/pos/i18163.scala

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import scala.language.implicitConversions
2+
3+
trait Foo[A]
4+
trait Bar[B]
5+
trait Qux[C]
6+
class Log[K[_]]
7+
8+
trait Inv[F[_]]
9+
object Inv:
10+
given monFoo: Inv[Foo] = ???
11+
given monBar: Inv[Bar] = ???
12+
13+
trait InvOps[H[_], D] { def desc(s: String): H[D] = ??? }
14+
trait LogOps[L[_]] { def desc(s: String): Log[L] = ??? }
15+
16+
class Test:
17+
implicit def LogOps[Q[_]](l: Log[Q]): LogOps[Q] = ???
18+
implicit def InvOps[J[_], E](j11: J[E])(implicit z: Inv[J]): InvOps[J, E] = ???
19+
20+
def fails = new Log[Qux].desc("fails")
21+
def works = LogOps[Qux](new Log[Qux]).desc("works")

0 commit comments

Comments
 (0)