blob: 8968d630d36726c6c4e1af9c36120681aabce2a2 [file] [log] [blame]
// RUN: %target-swift-frontend -disable-objc-attr-requires-foundation-module -typecheck -verify -import-cf-types -I %S/Inputs/custom-modules %s
// REQUIRES: objc_interop
import CoreCooling
import CFAndObjC
func assertUnmanaged<T>(_ t: Unmanaged<T>) {}
func assertManaged<T: AnyObject>(_ t: T) {}
func test0(_ fridge: CCRefrigerator) {
assertManaged(fridge)
}
func test1(_ power: Unmanaged<CCPowerSupply>) {
assertUnmanaged(power)
let fridge = CCRefrigeratorCreate(power) // expected-error {{cannot convert value of type 'Unmanaged<CCPowerSupply>' to expected argument type 'CCPowerSupply?'}}
assertUnmanaged(fridge)
}
func test2() {
let fridge = CCRefrigeratorCreate(kCCPowerStandard)!
assertUnmanaged(fridge)
}
func test3(_ fridge: CCRefrigerator) {
assertManaged(fridge)
}
func test4() {
// FIXME: this should not require a type annotation
let power: CCPowerSupply = kCCPowerStandard
assertManaged(power)
let fridge = CCRefrigeratorCreate(power)!
assertUnmanaged(fridge)
}
func test5() {
let power: Unmanaged<CCPowerSupply> = .passUnretained(kCCPowerStandard)
assertUnmanaged(power)
_ = CCRefrigeratorCreate(power.takeUnretainedValue())
}
func test6() {
let fridge = CCRefrigeratorCreate(nil)
fridge?.release()
}
func test7() {
let value = CFBottom()!
assertUnmanaged(value)
}
func test8(_ f: CCRefrigerator) {
_ = f as CFTypeRef
_ = f as AnyObject
}
func test9() {
let fridge = CCRefrigeratorCreateMutable(kCCPowerStandard).takeRetainedValue()
let constFridge: CCRefrigerator = fridge
CCRefrigeratorOpen(fridge)
let item = CCRefrigeratorGet(fridge, 0).takeUnretainedValue()
CCRefrigeratorInsert(item, fridge) // expected-error {{cannot convert value of type 'CCItem' to expected argument type 'CCMutableRefrigerator?'}}
CCRefrigeratorInsert(constFridge, item) // expected-error {{cannot convert value of type 'CCRefrigerator' to expected argument type 'CCMutableRefrigerator?'}}
CCRefrigeratorInsert(fridge, item)
CCRefrigeratorClose(fridge)
}
func testProperty(_ k: Kitchen) {
k.fridge = CCRefrigeratorCreate(kCCPowerStandard).takeRetainedValue()
CCRefrigeratorOpen(k.fridge)
CCRefrigeratorClose(k.fridge)
}
func testTollFree0(_ mduct: MutableDuct) {
_ = mduct as CCMutableDuct
let duct = mduct as Duct
_ = duct as CCDuct
}
func testTollFree1(_ ccmduct: CCMutableDuct) {
_ = ccmduct as MutableDuct
let ccduct: CCDuct = ccmduct
_ = ccduct as Duct
}
func testChainedAliases(_ fridge: CCRefrigerator) {
_ = fridge as CCRefrigerator
_ = fridge as CCFridge
_ = fridge as CCFridgeRef // expected-error{{'CCFridgeRef' has been renamed to 'CCFridge'}} {{17-28=CCFridge}}
}
func testBannedImported(_ object: CCOpaqueTypeRef) {
CCRetain(object) // expected-error {{'CCRetain' is unavailable: Core Foundation objects are automatically memory managed}} expected-warning {{result of call to 'CCRetain' is unused}}
CCRelease(object) // expected-error {{'CCRelease' is unavailable: Core Foundation objects are automatically memory managed}}
CCMungeAndRetain(object) // okay, has a custom swift_name
}
func testOutParametersGood() {
var fridge: CCRefrigerator?
CCRefrigeratorCreateIndirect(&fridge)
var power: CCPowerSupply?
CCRefrigeratorGetPowerSupplyIndirect(fridge!, &power)
var item: Unmanaged<CCItem>?
CCRefrigeratorGetItemUnaudited(fridge!, 0, &item)
}
func testOutParametersBad() {
let fridge: CCRefrigerator?
CCRefrigeratorCreateIndirect(fridge) // expected-error {{cannot convert value of type 'CCRefrigerator?' to expected argument type 'UnsafeMutablePointer<CCRefrigerator?>?'}}
let power: CCPowerSupply?
CCRefrigeratorGetPowerSupplyIndirect(0, power) // expected-error {{cannot convert value of type 'Int' to expected argument type 'CCRefrigerator?'}}
let item: CCItem?
CCRefrigeratorGetItemUnaudited(0, 0, item) // expected-error {{cannot convert value of type 'Int' to expected argument type 'CCRefrigerator?'}}
}
func nameCollisions() {
var objc: MyProblematicObject?
var cf: MyProblematicObjectRef?
cf = objc // expected-error {{cannot assign value of type 'MyProblematicObject?' to type 'MyProblematicObjectRef?'}}
objc = cf // expected-error {{cannot assign value of type 'MyProblematicObjectRef?' to type 'MyProblematicObject?'}}
var cfAlias: MyProblematicAliasRef?
cfAlias = cf // okay
cf = cfAlias // okay
var otherAlias: MyProblematicAlias?
otherAlias = cfAlias // expected-error {{cannot assign value of type 'MyProblematicAliasRef?' (aka 'Optional<MyProblematicObjectRef>') to type 'MyProblematicAlias?' (aka 'Optional<Float>')}}
cfAlias = otherAlias // expected-error {{cannot assign value of type 'MyProblematicAlias?' (aka 'Optional<Float>') to type 'MyProblematicAliasRef?' (aka 'Optional<MyProblematicObjectRef>')}}
func isOptionalFloat(_: inout Optional<Float>) {}
isOptionalFloat(&otherAlias) // okay
var np: NotAProblem?
var np2: NotAProblemRef? // expected-error{{'NotAProblemRef' has been renamed to 'NotAProblem'}} {{12-26=NotAProblem}}
np = np2
np2 = np
}
func testNonConstVoid() {
let value: Unmanaged<CFNonConstVoidRef> = CFNonConstBottom()!
assertUnmanaged(value)
}
class NuclearFridge: CCRefrigerator {} // expected-error {{cannot inherit from Core Foundation type 'CCRefrigerator'}}
extension CCRefrigerator {
@objc func foo() {} // expected-error {{method cannot be marked @objc because Core Foundation types are not classes in Objective-C}}
func bar() {} // okay, implicitly non-objc
}
protocol SwiftProto {}
@objc protocol ObjCProto {}
extension CCRefrigerator: ObjCProto {} // expected-error {{Core Foundation class 'CCRefrigerator' cannot conform to @objc protocol 'ObjCProto' because Core Foundation types are not classes in Objective-C}}
extension CCRefrigerator: SwiftProto {}