// RUN: %target-typecheck-verify-swift -enable-experimental-feature Extern -disable-availability-checking // REQUIRES: swift_feature_Extern @_extern(wasm, module: "m1", name: "f1") func f1(x: Int) -> Int @_extern(wasm, module: "m2", name: ) // expected-error {{expected string literal in '_extern' attribute}} func f2ErrorOnMissingNameLiteral(x: Int) -> Int // expected-error{{expected '{' in body of function declaration}} @_extern(wasm, module: "m3", name) // expected-error {{expected ':' after label 'name'}} func f3ErrorOnMissingNameColon(x: Int) -> Int // expected-error{{expected '{' in body of function declaration}} @_extern(wasm, module: "m4",) // expected-error {{expected name argument to '@_extern'}} func f4ErrorOnMissingNameLabel(x: Int) -> Int // expected-error{{expected '{' in body of function declaration}} @_extern(wasm, module: "m5") // expected-error {{expected ',' in '_extern' attribute}} func f5ErrorOnMissingName(x: Int) -> Int // expected-error{{expected '{' in body of function declaration}} @_extern(wasm, module: ) // expected-error {{expected string literal in '_extern' attribute}} expected-error {{expected ',' in '_extern' attribute}} func f6ErrorOnMissingModuleLiteral(x: Int) -> Int // expected-error{{expected '{' in body of function declaration}} @_extern(wasm, module) // expected-error {{expected ':' after label 'module'}} expected-error {{expected ',' in '_extern' attribute}} func f7ErrorOnMissingModuleColon(x: Int) -> Int // expected-error{{expected '{' in body of function declaration}} @_extern(wasm,) // expected-error {{expected module argument to '@_extern'}} expected-error {{expected ',' in '_extern' attribute}} func f8ErrorOnMissingModuleLabel(x: Int) -> Int // expected-error{{expected '{' in body of function declaration}} @_extern(wasm, module: "m9", name: "f9") func f9WithBody() {} // expected-error {{unexpected body of function declaration}} struct S { @_extern(wasm, module: "m10", name: "f10") // expected-error {{'@_extern' can only be applied to globals}} func f10Member() } func f11Scope() { @_extern(wasm, module: "m11", name: "f11") // expected-error{{'@_extern' can only be applied to globals}} func f11Inner() } @_extern(invalid, module: "m12", name: "f12") // expected-error {{expected '_extern' option such as 'c'}} func f12InvalidLang() // expected-error {{expected '{' in body of function declaration}} @_extern(c, "valid") func externCValid() @_extern(c, "_start_with_underscore") func underscoredValid() @_extern(c, "") // expected-error {{expected non-empty C name in '@_extern'}} func emptyCName() // Allow specifying any identifier explicitly @_extern(c, "0start_with_digit") func explicitDigitPrefixed() @_extern(c) // expected-warning {{C name '+' may be invalid; explicitly specify the name in '@_extern(c)' to suppress this warning}} func +(a: Int, b: Bool) -> Bool @_extern(c) // expected-warning {{C name '🥸_implicitInvalid' may be invalid; explicitly specify the name in '@_extern(c)' to suppress this warning}} func 🥸_implicitInvalid() @_extern(c) func omitCName() @_extern(c, ) // expected-error {{expected string literal in '_extern' attribute}} func editingCName() // expected-error {{expected '{' in body of function declaration}} struct StructScopeC { @_extern(c, "member_decl") // expected-error {{'@_extern' can only be applied to globals}} func memberDecl() @_extern(c, "static_member_decl") static func staticMemberDecl() @_extern(c, "global_static_variable") static var globalVariable: Int } struct GenericStruct { @_extern(c, "static_member_decl") // expected-error{{'@_extern' can only be applied to globals}} static func genericStaticMemberDecl() } func funcScopeC() { @_extern(c, "func_scope_inner") // expected-error {{'@_extern' can only be applied to globals}} func inner() } @_extern(c, "c_value") var nonFunc: Int = 0 // expected-error{{'@_extern' variable cannot have an initializer}} @_extern(c, "with_body") func withInvalidBody() {} // expected-error {{unexpected body of function declaration}} @_extern(c, "duplicate_attr_c_1") @_extern(c, "duplicate_attr_c_2") // expected-error {{duplicate attribute}} func duplicateAttrsC() @_extern(wasm, module: "dup", name: "duplicate_attr_wasm_1") @_extern(wasm, module: "dup", name: "duplicate_attr_wasm_2") // expected-error {{duplicate attribute}} func duplicateAttrsWasm() @_extern(c, "mixed_attr_c") @_extern(wasm, module: "mixed", name: "mixed_attr_wasm") func mixedAttrs_C_Wasm() class NonC {} @_extern(c) func nonCReturnTypes() -> NonC // expected-error {{'NonC' cannot be represented in C}} // @_extern(wasm) have no interface limitation @_extern(wasm, module: "non-c", name: "return_wasm") func nonCReturnTypesWasm() -> NonC @_extern(c) @_extern(wasm, module: "non-c", name: "return_mixed") func nonCReturnTypesMixed() -> NonC // expected-error {{'NonC' cannot be represented in C}} @_extern(c) func nonCParamTypes(_: Int, _: NonC) // expected-error {{'NonC' cannot be represented in C}} @_extern(wasm, module: "non-c", name: "param_wasm") func nonCParamTypesWasm(_: Int, _: NonC) @_extern(c) @_extern(wasm, module: "non-c", name: "param_mixed") func nonCParamTypesMixed(_: Int, _: NonC) // expected-error {{'NonC' cannot be represented in C}} @_extern(c) func defaultArgValue_C(_: Int = 42) @_extern(wasm, module: "", name: "") func defaultArgValue_Wasm(_: Int = 24) @_extern(c) func asyncFuncC() async // expected-error {{async functions cannot be represented in C}} @_extern(c) func throwsFuncC() throws // expected-error {{raising errors from C functions is not supported}} @_extern(c) func genericFuncC(_: T) // expected-error {{'T' cannot be represented in C}} @_extern(c) // expected-error {{'@_extern' cannot be applied to an @_cdecl declaration}} @_cdecl("another_c_name") func withAtCDecl_C() @_extern(wasm, module: "", name: "") // expected-error {{'@_extern' cannot be applied to an @_cdecl declaration}} @_cdecl("another_c_name") func withAtCDecl_Wasm() @_extern(c) // expected-error {{'@_extern' cannot be applied to an @_silgen_name declaration}} @_silgen_name("another_sil_name") func withAtSILGenName_C() @_extern(wasm, module: "", name: "") // expected-error {{'@_extern' cannot be applied to an @_silgen_name declaration}} @_silgen_name("another_sil_name") func withAtSILGenName_Wasm() @_extern(c) // expected-error {{'@_extern' cannot be applied to an @_silgen_name declaration}} expected-error {{'@_extern' cannot be applied to an @_cdecl declaration}} @_cdecl("another_c_name") @_silgen_name("another_sil_name") func withAtSILGenName_CDecl_C()