diff --git a/compiler/src/dotty/tools/dotc/core/TypeApplications.scala b/compiler/src/dotty/tools/dotc/core/TypeApplications.scala index 26132c7c0205..58f9732edf1f 100644 --- a/compiler/src/dotty/tools/dotc/core/TypeApplications.scala +++ b/compiler/src/dotty/tools/dotc/core/TypeApplications.scala @@ -346,7 +346,7 @@ class TypeApplications(val self: Type) extends AnyVal { } if ((dealiased eq stripped) || followAlias) try - val instantiated = dealiased.instantiate(args) + val instantiated = dealiased.instantiate(args.mapConserve(_.boxedUnlessFun(self))) if (followAlias) instantiated.normalized else instantiated catch case ex: IndexOutOfBoundsException => diff --git a/tests/neg-custom-args/captures/i15923-cases.scala b/tests/neg-custom-args/captures/i15923-cases.scala new file mode 100644 index 000000000000..5fbb95355a60 --- /dev/null +++ b/tests/neg-custom-args/captures/i15923-cases.scala @@ -0,0 +1,15 @@ +trait Cap { def use(): Int } +type Id[X] = [T] -> (op: X => T) -> T +def mkId[X](x: X): Id[X] = [T] => (op: X => T) => op(x) + +def foo(x: Id[{*} Cap]) = { + x(_.use()) // error +} + +def bar(io: {*} Cap, x: Id[{io} Cap]) = { + x(_.use()) +} + +def barAlt(a: {*} Cap, b: {*} Cap, x: Id[{a, b} Cap]) = { + x(_.use()) +} diff --git a/tests/neg-custom-args/captures/i15923.scala b/tests/neg-custom-args/captures/i15923.scala new file mode 100644 index 000000000000..ac7ee995150e --- /dev/null +++ b/tests/neg-custom-args/captures/i15923.scala @@ -0,0 +1,14 @@ +trait Cap { def use(): Int } +type Id[X] = [T] -> (op: X => T) -> T +def mkId[X](x: X): Id[X] = [T] => (op: X => T) => op(x) + +def bar() = { + def withCap[X](op: ({*} Cap) => X): X = { + val cap: {*} Cap = new Cap { def use() = { println("cap is used"); 0 } } + val result = op(cap) + result + } + + val leak = withCap(cap => mkId(cap)) + leak { cap => cap.use() } // error +}