Skip to content

Commit 2afc245

Browse files
committed
Restrict wildcard SAM criterion to proper classes
Traits are OK, since traits with wildcard arguments can be produced in source.
1 parent 36b02e0 commit 2afc245

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,10 +1099,10 @@ class Typer extends Namer
10991099
pt match {
11001100
case SAMType(sam)
11011101
if !defn.isFunctionType(pt) && mt <:< sam =>
1102+
def isWildcardClassSAM =
1103+
!pt.classSymbol.is(Trait) && pt.argInfos.exists(_.isInstanceOf[TypeBounds])
11021104
val targetTpe =
1103-
if isFullyDefined(pt, ForceDegree.all)
1104-
&& !pt.argInfos.exists(_.isInstanceOf[TypeBounds])
1105-
then
1105+
if isFullyDefined(pt, ForceDegree.all) && !isWildcardClassSAM then
11061106
pt
11071107
else if pt.isRef(defn.PartialFunctionClass) then
11081108
// Replace the underspecified expected type by one based on the closure method type

tests/pos/i8012.scala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
2+
3+
@FunctionalInterface
4+
abstract class Q[A] {
5+
def apply(a: A): Int
6+
}
7+
8+
trait T[A]
9+
10+
class C extends Q[?] // error: Type argument must be fully defined
11+
class D extends T[?] // error: Type argument must be fully defined
12+
13+
object O {
14+
def m(i: Int): Int = i
15+
val x: Q[_] = m // error: result type of lambda is an underspecified SAM type Q[?]
16+
}

0 commit comments

Comments
 (0)