blob: 54ff345dcfe845885606d3c5eb02781121b13cd9 [file] [log] [blame]
// RUN: %empty-directory(%t)
// RUN: %gyb %s -o %t/bridging-nsnumber-and-nsvalue.swift
// RUN: %target-swift-frontend -typecheck -verify %t/bridging-nsnumber-and-nsvalue.swift -swift-version 4
// REQUIRES: objc_interop
import Foundation
import CoreGraphics
%{
coercionTypes = {
'NSNumber': [
'Int',
'UInt',
'Int64',
'UInt64',
'Int32',
'UInt32',
'Int16',
'UInt16',
'Int8',
'UInt8',
'Float',
'Double',
'CGFloat',
],
'NSValue': [
'CGRect',
'CGPoint',
'CGSize',
],
}
}%
// For testing purposes, make everything Hashable. Don't do this at home
extension Equatable {
public static func ==(x: Self, y: Self) -> Bool {
fatalError("hella cray")
}
}
extension Hashable {
public func hash(into hasher: inout Hasher) {
fatalError("trill hiphy")
}
}
extension CGSize: Hashable {}
extension CGPoint: Hashable {}
extension CGRect: Hashable {}
% for ObjectType, ValueTypes in coercionTypes.items():
func bridgeNSNumberBackToSpecificType(object: ${ObjectType},
optional: ${ObjectType}?,
array: [${ObjectType}],
dictKeys: [${ObjectType}: Any],
dictValues: [AnyHashable: ${ObjectType}],
dictBoth: [${ObjectType}: ${ObjectType}],
set: Set<${ObjectType}>) {
% for Type in ValueTypes:
_ = object as ${Type} // expected-error{{use 'as!'}}
_ = object is ${Type}
_ = object as? ${Type}
_ = object as! ${Type}
_ = optional as ${Type}? // expected-error{{use 'as!'}}
_ = optional is ${Type}?
_ = optional as? ${Type}?
_ = optional as! ${Type}?
_ = optional as ${Type} // expected-error{{use 'as!'}}
_ = optional is ${Type}
_ = optional as? ${Type}
_ = optional as! ${Type}
_ = array as [${Type}] // expected-error{{use 'as!'}}
_ = array is [${Type}]
_ = array as? [${Type}]
_ = array as! [${Type}]
_ = dictKeys as [${Type}: Any] // expected-error{{use 'as!'}}
_ = dictKeys is [${Type}: Any]
_ = dictKeys as? [${Type}: Any]
_ = dictKeys as! [${Type}: Any]
_ = dictKeys as [${Type}: AnyObject] // expected-error{{use 'as!'}}
_ = dictKeys is [${Type}: AnyObject]
_ = dictKeys as? [${Type}: AnyObject]
_ = dictKeys as! [${Type}: AnyObject]
_ = dictValues as [AnyHashable: ${Type}] // expected-error{{use 'as!'}}
_ = dictValues is [AnyHashable: ${Type}]
_ = dictValues as? [AnyHashable: ${Type}]
_ = dictValues as! [AnyHashable: ${Type}]
_ = dictValues as [NSObject: ${Type}] // expected-error{{use 'as!'}}
_ = dictValues is [NSObject: ${Type}]
_ = dictValues as? [NSObject: ${Type}]
_ = dictValues as! [NSObject: ${Type}]
_ = dictBoth as [${ObjectType}: ${Type}] // expected-error{{use 'as!'}}
_ = dictBoth is [${ObjectType}: ${Type}]
_ = dictBoth as? [${ObjectType}: ${Type}]
_ = dictBoth as! [${ObjectType}: ${Type}]
_ = dictBoth as [${Type}: ${ObjectType}] // expected-error{{use 'as!'}}
_ = dictBoth is [${Type}: ${ObjectType}]
_ = dictBoth as? [${Type}: ${ObjectType}]
_ = dictBoth as! [${Type}: ${ObjectType}]
_ = dictBoth as [${Type}: ${Type}] // expected-error{{use 'as!'}}
_ = dictBoth is [${Type}: ${Type}]
_ = dictBoth as? [${Type}: ${Type}]
_ = dictBoth as! [${Type}: ${Type}]
_ = set as Set<${Type}> // expected-error{{use 'as!'}}
_ = set is Set<${Type}>
_ = set as? Set<${Type}>
_ = set as! Set<${Type}>
% end
_ = object is String // expected-warning{{always fails}}
_ = object as? String // expected-warning{{always fails}}
_ = object as! String // expected-warning{{always fails}}
}
% end