From 2c245b3d7d73ee4e7de0a4daff40da2a874e3ac2 Mon Sep 17 00:00:00 2001 From: Pavel Yaskevich Date: Sat, 10 Nov 2018 23:31:42 -0800 Subject: [PATCH 1/2] [TypeChecker] NFC: Add a couple of test-cases related to rdar://problem/20591571 --- test/attr/attr_autoclosure.swift | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/test/attr/attr_autoclosure.swift b/test/attr/attr_autoclosure.swift index e646a61403f75..39d70a732309f 100644 --- a/test/attr/attr_autoclosure.swift +++ b/test/attr/attr_autoclosure.swift @@ -175,3 +175,31 @@ func passNonThrowingToThrowingAC(_ fn: @autoclosure () -> Int) { func passThrowingToThrowingAC(_ fn: @autoclosure () throws -> Int) { takesThrowingAutoclosure(fn) } + +// rdar://problem/20591571 - Various type inference problems with @autoclosure +func rdar_20591571() { + func foo(_ g: @autoclosure () -> Int) { + typealias G = ()->Int + let _ = unsafeBitCast(g, to: G.self) // expected-error {{converting non-escaping value to 'T' may allow it to escape}} + } + + func id(_: T) -> T {} + func same(_: T, _: T) {} + + func takesAnAutoclosure(_ fn: @autoclosure () -> Int, _ efn: @escaping @autoclosure () -> Int) { + // expected-note@-1 2{{parameter 'fn' is implicitly non-escaping}} + + var _ = fn // expected-error {{non-escaping parameter 'fn' may only be called}} + let _ = fn // expected-error {{non-escaping parameter 'fn' may only be called}} + + var _ = efn + let _ = efn + + _ = id(fn) // expected-error {{converting non-escaping value to 'T' may allow it to escape}} + _ = same(fn, { 3 }) // expected-error {{converting non-escaping value to 'T' may allow it to escape}} + _ = same({ 3 }, fn) // expected-error {{converting non-escaping value to 'T' may allow it to escape}} + + withoutActuallyEscaping(fn) { _ in } // Ok + withoutActuallyEscaping(fn) { (_: () -> Int) in } // Ok + } +} From 6eb94ce1cced515964316ee1a217e8abfa91a5be Mon Sep 17 00:00:00 2001 From: Pavel Yaskevich Date: Sun, 11 Nov 2018 00:06:15 -0800 Subject: [PATCH 2/2] [TypeChecker] NFC: Add a test-case for rdar://problem/30906031 This problem has been fixed by @autoclosure rework. --- test/attr/attr_autoclosure.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/attr/attr_autoclosure.swift b/test/attr/attr_autoclosure.swift index 39d70a732309f..3801fd4455cb3 100644 --- a/test/attr/attr_autoclosure.swift +++ b/test/attr/attr_autoclosure.swift @@ -203,3 +203,10 @@ func rdar_20591571() { withoutActuallyEscaping(fn) { (_: () -> Int) in } // Ok } } + +// rdar://problem/30906031 - [SR-4188]: withoutActuallyEscaping doesn't accept an @autoclosure argument +func rdar_30906031(in arr: [Int], fn: @autoclosure () -> Int) -> Bool { + return withoutActuallyEscaping(fn) { escapableF in // Ok + arr.lazy.filter { $0 >= escapableF() }.isEmpty + } +}