Skip to content

Commit 1155e98

Browse files
committed
Handle FlexibleTypes in asContextFunctionType
Fixes #23845
1 parent 13d4963 commit 1155e98

File tree

3 files changed

+20
-1
lines changed

3 files changed

+20
-1
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1996,6 +1996,8 @@ class Definitions {
19961996
asContextFunctionType(TypeComparer.bounds(tp1).hiBound)
19971997
case tp1 @ PolyFunctionOf(mt: MethodType) if mt.isContextualMethod =>
19981998
tp1
1999+
case tp1: FlexibleType =>
2000+
asContextFunctionType(tp1.underlying)
19992001
case tp1 =>
20002002
if tp1.typeSymbol.name.isContextFunction && isFunctionNType(tp1) then tp1
20012003
else NoType

tests/explicit-nulls/flexible-unpickle/Flexible_2.scala

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import unsafeNulls.Foo.*
22
import unsafeNulls.Unsafe_1
3-
import unsafeNulls.{A, B, C, F, G, H, I, J, L, M}
3+
import unsafeNulls.{A, B, C, F, G, H, I, J, L, M, S, T, U, expects}
44
import scala.reflect.Selectable.reflectiveSelectable
5+
import scala.quoted.*
56

67
class Inherit_1 extends Unsafe_1 {
78
override def foo(s: String): String = s
@@ -97,3 +98,13 @@ def Flexible_2() =
9798

9899
val m: String = M.test(null)
99100

101+
// i23845
102+
def typeNameMacro[A: Type](using Quotes) = Expr(Type.show[A])
103+
transparent inline def typeName[A]: String = ${typeNameMacro[A]}
104+
105+
implicit val givenT: T = ???
106+
def alphaTypeNameMacro[A: S](using T) = U(S.show[A])
107+
def res[A] = {
108+
implicit val givenS: S[A] = ???
109+
expects(alphaTypeNameMacro[A])
110+
}

tests/explicit-nulls/flexible-unpickle/Unsafe_1.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,9 @@ object M {
7373
def test(input: => String): String = "foo " + input
7474
}
7575

76+
class S[X]
77+
object S { def show[X] = "dummyStr" }
78+
class T
79+
class U[Y](a: Y)
80+
def expects(take: (T) ?=> U[String]) = ???
81+

0 commit comments

Comments
 (0)