Files
swift-mirror/test/attr/attr_expose.swift
Gabor Horvath 7ac9a81b1e [cxx-interop] Add attribute to hide Swift declarations from interop
This can help work around problems when the names of a C++ declaration
and a Swift declaration would collide, or to temporarily work around
compiler bugs.

rdar://152838988&140802127&158843666
2025-09-01 12:29:34 +01:00

73 lines
2.3 KiB
Swift

// RUN: %target-typecheck-verify-swift
@_cdecl("cdecl_foo") func foo(x: Int) -> Int { return x }
@_expose(Cxx) func test() {}
@_expose(Cxx, "renamed") func renamedFunc() {}
@_expose(Cxx, "") func emptyNameOk() {}
@_expose // expected-error {{expected '(' in '_expose' attribute}}
func exposeWithoutArgs() {}
@_expose(CplusPlus) // expected-error {{expected '_expose' option such as 'Cxx'}}
func incorrectLangSpecifier() {}
@_expose(Cxx) @_cdecl("test") // expected-error {{'@_expose' cannot be applied to an '@_cdecl' declaration}}
func cdeclAndExpose() {}
@_expose(Cxx) @_expose(!Cxx) // expected-error {{'@_expose' cannot be applied to an '@_expose(Cxx)' declaration}}
func contradictingExpose() {}
@_expose(!Cxx) @_expose(Cxx) // expected-error {{'@_expose' cannot be applied to an '@_expose(Cxx)' declaration}}
func contradictingExpose2() {}
@_expose(!Cxx, "name") // expected-error {{'@_expose(!Cxx)' does not accept a name argument}}
func notExposeWithName() {}
func hasNested() {
@_expose(Cxx) // expected-error{{can only be used in a non-local scope}}
func nested() { }
}
struct NotExposedStruct {
@_expose(Cxx) // expected-error {{'@_expose' cannot be applied inside of unexposed declaration 'NotExposedStruct'}}
func errorOnInnerExpose() {}
}
@_expose(Cxx)
struct ExposedStruct {
@_expose(Cxx, "create") // expected-error {{invalid declaration name 'create' specified in '@_expose'; exposed initializer name must start with 'init'}}
init() {}
@_expose(Cxx, "initWith")
init(with y: Int) {}
}
@_expose(Cxx)
@_expose(Cxx) // expected-error {{duplicate attribute}}
func exposeToCxxCxx() {}
@_expose(wasm) func exposeToWasm() {}
@_expose(wasm, "with_name") func wasmName() {}
@_expose(wasm, "") func wasmEmptyNameOk() {}
@_expose(wasm) struct WasmErrorOnStruct { // expected-error {{'@_expose' with 'wasm' can only be applied to global functions}}
@_expose(wasm) func errorOnMethod() {} // expected-error {{'@_expose' with 'wasm' can only be applied to global functions}}
}
func wasmNested() {
@_expose(wasm) // expected-error {{attribute '_expose' can only be used in a non-local scope}}
func errorOnInnerExpose() {}
}
@_expose(Cxx)
@_expose(wasm)
func exposeToCxxWasm() {}
@_expose(wasm)
@_expose(Cxx)
func exposeToWasmCxx() {}
@_expose(wasm)
@_expose(wasm) // expected-error {{duplicate attribute}}
func exposeToWasmWasm() {}