Files
swift-mirror/test/Interop/Cxx/library-evolution/allow-c-in-cxx-mode-in-interfaces.swift
Egor Zhdan 00e6b360d5 [cxx-interop] Assume that plain-C enums are resilient
This fixes sudden compiler errors that are emitted when trying to use CoreText.framework with C++ interop enabled.

When Swift is trying to rebuild a dependency module from its textual interface, it should not complain on usages of C enums in public Swift APIs.

This still leaves the resilience safety guardrail enabled for C++ scoped enums.

rdar://143215914
2025-01-21 18:57:10 +00:00

52 lines
1.5 KiB
Swift

// RUN: %empty-directory(%t)
// RUN: split-file %s %t
// Build a Swift library that uses symbols from a C library without enabling C++ interop.
// RUN: %target-build-swift %t/uses-c-library.swift -emit-module -emit-library -enable-library-evolution -module-name UsesCLibrary -emit-module-path %t/artifacts/UsesCLibrary.swiftmodule -emit-module-interface-path %t/artifacts/UsesCLibrary.swiftinterface -I %S/Inputs
// Make sure the module interface can be type-checked with C++ interop enabled.
// RUN: %target-swift-frontend -typecheck-module-from-interface -cxx-interoperability-mode=default %t/artifacts/UsesCLibrary.swiftinterface -I %S/Inputs
// Make sure we can build a Swift executable that uses the library and enables C++ interop.
// RUN: %target-swift-frontend -typecheck -cxx-interoperability-mode=default -module-name Main %t/main.swift -I %t/artifacts -I %S/Inputs
//--- uses-c-library.swift
import MyCLibrary
public func getMyCStruct() -> MyCStruct {
return MyCStruct()
}
extension MyCStruct {
@inlinable public var y: CInt {
get {
return self.x
}
}
@inlinable public var anotherInstanceOfSelf: MyCStruct {
get {
return MyCStruct(x: self.x + 1)
}
}
}
public func getMyCEnum() -> MyCEnum {
return MCE_One
}
public func getMyCFixedEnum() -> MyCFixedEnum {
return MCFE_One
}
//--- main.swift
import UsesCLibrary
let _ = getMyCStruct()
let _ = getMyCStruct().y
let _ = getMyCStruct().anotherInstanceOfSelf
let _ = getMyCEnum()
let _ = getMyCFixedEnum()