blob: 961f3ee28deb2d30b77ccc8178d2d0963b6151d3 [file] [log] [blame]
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-silgen -parse-as-library -verify %s
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-sil -O -parse-as-library -DEMIT_SIL %s
// REQUIRES: objc_interop
import Foundation
import errors
#if !EMIT_SIL
func test0() {
try ErrorProne.fail() // expected-error {{errors thrown from here are not handled}}
}
#endif
// Test "AndReturnError" stripping.
// rdar://20722195
func testAndReturnError() throws {
try ErrorProne.fail()
try ErrorProne.go()
try ErrorProne.tryAndReturnError(()) // collides with 'try' keyword
ErrorProne.messUpSignatureAndReturnError(nil) // wrong signature
}
func testInheritedInit() throws {
try ReallyErrorProne(one: nil) // expected-warning{{unused}}
}
func testInheritedFactory() throws {
try ReallyErrorProne(two: nil) // expected-warning{{unused}}
}
// Resolve a conflict between -foo and -foo: by just not
// importing the latter as throwing.
func testConflict1(_ obj: ErrorProne) throws {
try obj.conflict1() // expected-warning {{no calls to throwing functions occur within 'try'}}
}
func testConflict1_error(_ obj: ErrorProne) throws {
var error: NSError?
obj.conflict1(&error)
}
// Resolve a conflict between -foo and -fooAndReturnError:
// by not changing the name of the latter.
func testConflict2(_ obj: ErrorProne) throws {
try obj.conflict2() // expected-warning {{no calls to throwing functions occur within 'try'}}
}
func testConflict2_error(_ obj: ErrorProne) throws {
try obj.conflict2AndReturnError()
}
// Resolve a conflict between -foo: and -foo:error: by not
// changing the name of the latter.
func testConflict3(_ obj: ErrorProne) throws {
try obj.conflict3(nil) // expected-warning {{no calls to throwing functions occur within 'try'}}
}
func testConflict3_error(_ obj: ErrorProne) throws {
try obj.conflict3(nil, error: ())
}
// Same as above but with an initializer.
// <rdar://problem/20922973>
func testConflict4() throws {
try ErrorProne(newtonMessagePad: "Dilbert") // expected-warning {{no calls to throwing functions occur within 'try'}} // expected-warning{{unused}}
}
func testConflict4_error() throws {
try ErrorProne(newtonMessagePad: "Eat Up Martha", error: ()) // expected-warning{{unused}}
}
func testBlockFinal() throws {
try ErrorProne.run(callback: {})
try ErrorProne.runWithAnError(callback: {})
try ErrorProne.runSwiftly(5000, callback: {})
}
#if !EMIT_SIL
func testNonBlockFinal() throws {
ErrorProne.runWithError(count: 0) // expected-error {{missing argument for parameter #1 in call}}
ErrorProne.run(count: 0) // expected-error {{incorrect argument label in call (have 'count:', expected 'callback:')}}
}
#endif
class VeryErrorProne : ErrorProne {
override class func fail() throws {}
}
func testConflictWithUnavailable() throws {
try ErrorProne.doTheThing(42)
}
// rdar://21715350
func testSwiftError() throws {
var err: NSError?
let _: Bool = try ErrorProne.bound()
let _: Float = try ErrorProne.bounce()
let _: () = try ErrorProne.flounce()
let _: CInt = try ErrorProne.ounce()
let _: () = try ErrorProne.once()
let _: () = try ErrorProne.sconce()
let _: () = try ErrorProne.scotch()
let _: Bool = ErrorProne.scout(&err)
}
// rdar://21074857
func needsNonThrowing(_ fn: () -> Void) {}
func testNSErrorExhaustive() {
needsNonThrowing {
do {
try ErrorProne.fail()
} catch let e as NSError {
e // expected-warning {{expression of type 'NSError' is unused}}
}
}
}
func testBadOverrides(obj: FoolishErrorSub) throws {
try obj.performRiskyOperation()
let _: FoolishErrorSub = try obj.produceRiskyOutput()
let _: String = try obj.produceRiskyString()
let _: NSObject = try obj.badNullResult()
let _: CInt = try obj.badNullResult2() // This is unfortunate but consistent.
let _: CInt = try obj.badZeroResult()
try obj.badNonzeroResult() as Void
let base = obj as SensibleErrorBase
try base.performRiskyOperation()
let _: NSObject = try base.produceRiskyOutput()
let _: String = try base.produceRiskyString()
let _: NSObject = try base.badNullResult()
let _: NSObject = try base.badNullResult2()
let _: CInt = try base.badZeroResult()
try base.badNonzeroResult() as Void
}