@@ -96,20 +96,21 @@ class CheckCaptures extends RefineTypes:
96
96
97
97
inline val disallowGlobal = true
98
98
99
+ def checkRelativeVariance (mt : MethodType , whole : Type , pos : SrcPos )(using Context ) = new TypeTraverser :
100
+ def traverse (tp : Type ): Unit = tp match
101
+ case CapturingType (parent, ref @ TermParamRef (`mt`, _)) =>
102
+ if variance <= 0 then
103
+ val direction = if variance < 0 then " contra" else " in"
104
+ report.error(em " captured reference $ref appears ${direction}variantly in type $whole" , pos)
105
+ traverse(parent)
106
+ case _ =>
107
+ traverseChildren(tp)
108
+
99
109
def checkWellFormed (whole : Type , pos : SrcPos )(using Context ): Unit =
100
- def checkRelativeVariance (mt : MethodType ) = new TypeTraverser :
101
- def traverse (tp : Type ): Unit = tp match
102
- case CapturingType (parent, ref @ TermParamRef (`mt`, _)) =>
103
- if variance <= 0 then
104
- val direction = if variance < 0 then " contra" else " in"
105
- report.error(em " captured reference $ref appears ${direction}variantly in type $whole" , pos)
106
- traverse(parent)
107
- case _ =>
108
- traverseChildren(tp)
109
110
val checkVariance = new TypeTraverser :
110
111
def traverse (tp : Type ): Unit = tp match
111
112
case mt : MethodType if mt.isResultDependent =>
112
- checkRelativeVariance(mt).traverse(mt)
113
+ checkRelativeVariance(mt, whole, pos ).traverse(mt)
113
114
case _ =>
114
115
traverseChildren(tp)
115
116
checkVariance.traverse(whole)
@@ -138,6 +139,16 @@ class CheckCaptures extends RefineTypes:
138
139
// it's inferred, no need to check
139
140
case tree : TypTree =>
140
141
checkWellFormed(tree.tpe, tree.srcPos)
142
+ case tree : DefDef =>
143
+ def check (tp : Type ): Unit = tp match
144
+ case tp : PolyType =>
145
+ check(tp.resType)
146
+ case mt : MethodType =>
147
+ if mt.isResultDependent then
148
+ checkRelativeVariance(mt, tree.symbol.info, ctx.source.atSpan(tree.nameSpan)).traverse(mt)
149
+ check(mt.resType)
150
+ case _ =>
151
+ check(tree.symbol.info)
141
152
case _ =>
142
153
traverseChildren(tree)
143
154
0 commit comments