File tree Expand file tree Collapse file tree 4 files changed +55
-0
lines changed
compiler/src/dotty/tools/dotc/cc
tests/neg-custom-args/captures Expand file tree Collapse file tree 4 files changed +55
-0
lines changed Original file line number Diff line number Diff line change @@ -168,6 +168,13 @@ object CheckCaptures:
168
168
if ! seen.contains(t) then
169
169
seen += t
170
170
traverseChildren(t)
171
+
172
+ // Check the lower bound of path dependent types.
173
+ // See issue #19330.
174
+ val isTypeParam = t.prefix eq NoPrefix
175
+ t.info match
176
+ case TypeBounds (lo, hi) if ! isTypeParam => traverse(lo)
177
+ case _ =>
171
178
case AnnotatedType (_, ann) if ann.symbol == defn.UncheckedCapturesAnnot =>
172
179
()
173
180
case t =>
Original file line number Diff line number Diff line change
1
+ import language .experimental .captureChecking
2
+
3
+ trait Logger
4
+ def usingLogger [T ](op : Logger ^ => T ): T = ???
5
+
6
+ def foo [T >: () => Logger ^ ](): T =
7
+ val leaked = usingLogger[T ]: l => // ok
8
+ val t : () => Logger ^ = () => l
9
+ t : T
10
+ leaked
11
+
12
+ def test (): Unit =
13
+ val bad : () => Logger ^ = foo[() => Logger ^ ] // error
14
+ val leaked : Logger ^ = bad() // leaked scoped capability!
Original file line number Diff line number Diff line change
1
+ import language .experimental .captureChecking
2
+
3
+ trait Logger
4
+ def usingLogger [T ](op : Logger ^ => T ): T = ???
5
+
6
+ trait Foo :
7
+ type T >: () => Logger ^
8
+
9
+ def foo : this .T =
10
+ val leaked = usingLogger[T ]: l => // error
11
+ val t : () => Logger ^ = () => l
12
+ t : T
13
+ leaked
Original file line number Diff line number Diff line change
1
+ import language .experimental .captureChecking
2
+
3
+ trait Logger
4
+ def usingLogger [T ](op : Logger ^ => T ): T = ???
5
+
6
+ trait Foo :
7
+ type T >: () => Logger ^
8
+
9
+ class Bar extends Foo :
10
+ type T = () => Logger ^
11
+
12
+ def foo (x : Foo ): x.T =
13
+ val leaked = usingLogger[x.T ]: l => // error
14
+ val t : () => Logger ^ = () => l
15
+ t : x.T
16
+ leaked
17
+
18
+ def test (): Unit =
19
+ val bar = new Bar
20
+ val bad : bar.T = foo(bar)
21
+ val leaked : Logger ^ = bad() // leaked scoped capability!
You can’t perform that action at this time.
0 commit comments