| // -*- swift -*- |
| // RUN: %target-run-simple-swiftgyb |
| // REQUIRES: executable_test |
| |
| // FIXME: Casting.cpp has dozens of places to fail a cast. This test does not |
| // attempt to enumerate them all. |
| |
| // XFAIL: linux |
| |
| import StdlibUnittest |
| |
| |
| import Foundation |
| |
| |
| % types = [] |
| % objectTypes = [] |
| % protocolTypes = [] |
| |
| % types.append(['main.Class1', 'main.Class2']) |
| % objectTypes.append(['main.Class1', 'main.Class2']) |
| class Class1 { } |
| class Class2 { } |
| |
| % types.append(['main.Struct1', 'main.Struct2']) |
| struct Struct1 { } |
| struct Struct2 { } |
| |
| % types.append(['main.ObjCClass1', 'main.ObjCClass2']) |
| % objectTypes.append(['main.ObjCClass1', 'main.ObjCClass2']) |
| class ObjCClass1 : NSObject { } |
| class ObjCClass2 : NSObject { } |
| |
| % types.append(['DateFormatter', 'NumberFormatter']) |
| % objectTypes.append(['DateFormatter', 'NumberFormatter']) |
| // non-Swift Objective-C class |
| |
| % protocolTypes.append('main.Proto1') |
| % protocolTypes.append('main.Proto2') |
| protocol Proto1 { } |
| protocol Proto2 { } |
| % protocolTypes.append('URLSessionDelegate') |
| // non-Swift Objective-C protocol |
| |
| |
| var CastTrapsTestSuite = TestSuite("CastTraps") |
| |
| // Test `(T1() as Any) as T2` cast failure |
| // for all type pairs. |
| |
| % for (t1, _) in types: |
| % for (_, t2) in types: |
| |
| CastTrapsTestSuite.test("${t1}__${t2}") |
| .skip(.custom( |
| { _isFastAssertConfiguration() }, |
| reason: "this trap is not guaranteed to happen in -Ounchecked")) |
| .crashOutputMatches("Could not cast value of type '") |
| .crashOutputMatches("${t1}' ") |
| .crashOutputMatches(" to '") |
| .crashOutputMatches("${t2}'") |
| .code |
| { |
| let o = ${t1}() as Any |
| expectCrashLater() |
| let r = o as! ${t2} |
| _blackHole(r) |
| } |
| |
| % end |
| % end |
| |
| // Test `(T1() as AnyObject) as T2` cast failure |
| // for object type to protocol type pairs |
| |
| % for (t1, _) in objectTypes: |
| % for (t2) in protocolTypes: |
| |
| CastTrapsTestSuite.test("${t1}__${t2}") |
| .skip(.custom( |
| { _isFastAssertConfiguration() }, |
| reason: "this trap is not guaranteed to happen in -Ounchecked")) |
| .crashOutputMatches("Could not cast value of type '") |
| .crashOutputMatches("${t1}' ") |
| .crashOutputMatches(" to '") |
| .crashOutputMatches("${t2}'") |
| .code |
| { |
| let o = ${t1}() as AnyObject |
| expectCrashLater() |
| let r = o as! ${t2} |
| _blackHole(r) |
| } |
| |
| % end |
| % end |
| |
| runAllTests() |