diff --git a/include/swift/AST/DiagnosticsClangImporter.def b/include/swift/AST/DiagnosticsClangImporter.def index 22d0d0b5f422a..2d412da91cd77 100644 --- a/include/swift/AST/DiagnosticsClangImporter.def +++ b/include/swift/AST/DiagnosticsClangImporter.def @@ -105,6 +105,12 @@ GROUPED_WARNING(clang_ignored_sendable_attr, ClangDeclarationImport, none, "cannot be added to it", (Type)) +GROUPED_WARNING(warn_clang_ignored_bounds_on_self, ClangDeclarationImport, none, + "bounds attribute '%0' ignored on parameter mapped to 'self'", + (StringRef)) +NOTE(note_swift_name_instance_method, none, + "swift_name maps free function to instance method here", ()) + WARNING(implicit_bridging_header_imported_from_module,none, "implicit import of bridging header '%0' via module %1 " "is deprecated and will be removed in a later version of Swift", diff --git a/lib/ClangImporter/ImportDecl.cpp b/lib/ClangImporter/ImportDecl.cpp index ccef3f30caaa3..c5a1c00f7a959 100644 --- a/lib/ClangImporter/ImportDecl.cpp +++ b/lib/ClangImporter/ImportDecl.cpp @@ -9445,6 +9445,22 @@ void ClangImporter::Implementation::addOptionSetTypealiases( #define SIW_DBG(x) DEBUG_WITH_TYPE("safe-interop-wrappers", llvm::dbgs() << x) +// until CountAttributedType::getAttributeName lands in our LLVM branch +static StringRef getAttributeName(const clang::CountAttributedType *CAT) { + switch (CAT->getKind()) { + case clang::CountAttributedType::CountedBy: + return "__counted_by"; + case clang::CountAttributedType::CountedByOrNull: + return "__counted_by_or_null"; + case clang::CountAttributedType::SizedBy: + return "__sized_by"; + case clang::CountAttributedType::SizedByOrNull: + return "__sized_by_or_null"; + case clang::CountAttributedType::EndedBy: + llvm_unreachable("CountAttributedType cannot be ended_by"); + } +} + void ClangImporter::Implementation::swiftify(AbstractFunctionDecl *MappedDecl) { if (!SwiftContext.LangOpts.hasFeature(Feature::SafeInteropWrappers)) return; @@ -9460,9 +9476,6 @@ void ClangImporter::Implementation::swiftify(AbstractFunctionDecl *MappedDecl) { ClangDecl->getAccess() == clang::AS_private) return; - if (ClangDecl->getNumParams() != MappedDecl->getParameters()->size()) - return; - MacroDecl *SwiftifyImportDecl = dyn_cast_or_null(getKnownSingleDecl(SwiftContext, "_SwiftifyImport")); if (!SwiftifyImportDecl) return; @@ -9519,14 +9532,44 @@ void ClangImporter::Implementation::swiftify(AbstractFunctionDecl *MappedDecl) { true); returnHasLifetimeInfo = true; } + + bool isClangInstanceMethod = + isa(ClangDecl) && + !isa(ClangDecl) && + cast(ClangDecl)->isInstance(); + size_t swiftNumParams = MappedDecl->getParameters()->size() - + (ClangDecl->isVariadic() ? 1 : 0); + ASSERT((MappedDecl->isImportAsInstanceMember() == isClangInstanceMethod) == + (ClangDecl->getNumParams() == swiftNumParams)); + + size_t selfParamIndex = MappedDecl->isImportAsInstanceMember() + ? MappedDecl->getSelfIndex() + : ClangDecl->getNumParams(); for (auto [index, clangParam] : llvm::enumerate(ClangDecl->parameters())) { auto clangParamTy = clangParam->getType(); - auto swiftParam = MappedDecl->getParameters()->get(index); + int mappedIndex = index < selfParamIndex ? index : + index > selfParamIndex ? index - 1 : + SwiftifyInfoPrinter::SELF_PARAM_INDEX; + ParamDecl *swiftParam = nullptr; + if (mappedIndex == SwiftifyInfoPrinter::SELF_PARAM_INDEX) { + swiftParam = MappedDecl->getImplicitSelfDecl(/*createIfNeeded*/true); + } else { + swiftParam = MappedDecl->getParameters()->get(mappedIndex); + } + ASSERT(swiftParam); Type swiftParamTy = swiftParam->getInterfaceType(); bool paramHasBoundsInfo = false; auto *CAT = clangParamTy->getAs(); - if (SwiftifiableCAT(getClangASTContext(), CAT, swiftParamTy)) { - printer.printCountedBy(CAT, index); + if (CAT && mappedIndex == SwiftifyInfoPrinter::SELF_PARAM_INDEX) { + diagnose(HeaderLoc(clangParam->getLocation()), + diag::warn_clang_ignored_bounds_on_self, getAttributeName(CAT)); + auto swiftName = ClangDecl->getAttr(); + ASSERT(swiftName && + "free function mapped to instance method without swift_name??"); + diagnose(HeaderLoc(swiftName->getLocation()), + diag::note_swift_name_instance_method); + } else if (SwiftifiableCAT(getClangASTContext(), CAT, swiftParamTy)) { + printer.printCountedBy(CAT, mappedIndex); SIW_DBG(" Found bounds info '" << clangParamTy << "' on parameter '" << *clangParam << "'\n"); attachMacro = paramHasBoundsInfo = true; @@ -9538,7 +9581,7 @@ void ClangImporter::Implementation::swiftify(AbstractFunctionDecl *MappedDecl) { bool paramHasLifetimeInfo = false; if (clangParam->hasAttr()) { SIW_DBG(" Found noescape attribute on parameter '" << *clangParam << "'\n"); - printer.printNonEscaping(index); + printer.printNonEscaping(mappedIndex); paramHasLifetimeInfo = true; } if (clangParam->hasAttr()) { @@ -9546,8 +9589,10 @@ void ClangImporter::Implementation::swiftify(AbstractFunctionDecl *MappedDecl) { << *clangParam << "'\n"); // If this parameter has bounds info we will tranform it into a Span, // so then it will no longer be Escapable. - bool willBeEscapable = swiftParamTy->isEscapable() && !paramHasBoundsInfo; - printer.printLifetimeboundReturn(index, willBeEscapable); + bool willBeEscapable = swiftParamTy->isEscapable() && + (!paramHasBoundsInfo || + mappedIndex == SwiftifyInfoPrinter::SELF_PARAM_INDEX); + printer.printLifetimeboundReturn(mappedIndex, willBeEscapable); paramHasLifetimeInfo = true; returnHasLifetimeInfo = true; } @@ -9563,7 +9608,6 @@ void ClangImporter::Implementation::swiftify(AbstractFunctionDecl *MappedDecl) { } printer.printAvailability(); printer.printTypeMapping(typeMapping); - } if (attachMacro) { diff --git a/lib/Macros/Sources/SwiftMacros/SwiftifyImportMacro.swift b/lib/Macros/Sources/SwiftMacros/SwiftifyImportMacro.swift index 0b83bb130e3c6..3f2a99749f998 100644 --- a/lib/Macros/Sources/SwiftMacros/SwiftifyImportMacro.swift +++ b/lib/Macros/Sources/SwiftMacros/SwiftifyImportMacro.swift @@ -468,7 +468,14 @@ struct FunctionCallBuilder: BoundsCheckedThunkBuilder { let functionRef = DeclReferenceExprSyntax(baseName: base.name) let args: [ExprSyntax] = base.signature.parameterClause.parameters.enumerated() .map { (i: Int, param: FunctionParameterSyntax) in - return pointerArgs[i] ?? ExprSyntax("\(param.name)") + if let overrideArg = pointerArgs[i] { + return overrideArg + } + if isInout(getParam(base.signature, i).type) { + return ExprSyntax("&\(param.name)") + } else { + return ExprSyntax("\(param.name)") + } } let labels: [TokenSyntax?] = base.signature.parameterClause.parameters.map { param in let firstName = param.firstName.trimmed diff --git a/test/Interop/C/swiftify-import/import-as-instance-method.swift b/test/Interop/C/swiftify-import/import-as-instance-method.swift new file mode 100644 index 0000000000000..53ba6c2e3c3a6 --- /dev/null +++ b/test/Interop/C/swiftify-import/import-as-instance-method.swift @@ -0,0 +1,212 @@ +// REQUIRES: swift_feature_SafeInteropWrappers + +// RUN: %empty-directory(%t) +// RUN: split-file %s %t + +// RUN: %target-swift-frontend -emit-module -plugin-path %swift-plugin-dir -o %t/Test.swiftmodule -I %t/Inputs -enable-experimental-feature SafeInteropWrappers -strict-memory-safety -verify -verify-additional-file %t/Inputs/instance.h %t/test.swift -I %bridging-path -DVERIFY +// RUN: env SWIFT_BACKTRACE="" %target-swift-frontend -emit-module -plugin-path %swift-plugin-dir -o %t/Test.swiftmodule -I %t/Inputs -enable-experimental-feature SafeInteropWrappers -strict-memory-safety -warnings-as-errors -Xcc -Werror %t/test.swift -dump-macro-expansions -I %bridging-path 2> %t/out.txt +// RUN: diff --strip-trailing-cr %t/out.txt %t/out.expected + +//--- test.swift +import Instance + +@available(macOS 13.3.0, *) +func foo(_ p: inout MutableSpan, a: A, aa: inout A, c: C, b: B, bb: inout B) { + aa.basic(&p) + aa.bar(&p) + a.constSelf(&p) + a.valSelf(&p) + let _: MutableSpan = a.lifetimeBoundSelf(3) + c.refSelf(&p) + b.nonescaping(&p) + let _: MutableSpan = bb.nonescapingLifetimebound(73) + +#if VERIFY + aa.countedSelf(&p) + a.basic(&p) // expected-error{{cannot use mutating member on immutable value: 'a' is a 'let' constant}} +#endif +} + +//--- Inputs/instance.h +#include +#include +#include + +struct A {}; +struct SWIFT_NONESCAPABLE B {}; +struct SWIFT_IMMORTAL_REFERENCE C {}; + +void basic(struct A *a, int * __counted_by(len) p __noescape, int len) __attribute__((swift_name("A.basic(self:_:_:)"))); + +void renamed(struct A *a, int * __counted_by(len) p __noescape, int len) __attribute__((swift_name("A.bar(self:_:_:)"))); + +void countedSelf(struct A * __counted_by(len) + a, // expected-warning{{bounds attribute '__counted_by' ignored on parameter mapped to 'self'}} + int * __counted_by(len) p __noescape, int len) + __attribute__(( + swift_name // expected-note{{swift_name maps free function to instance method here}} + ("A.countedSelf(self:_:_:)"))); + +void constSelf(const struct A *a, int * __counted_by(len) p __noescape, int len) __attribute__((swift_name("A.constSelf(self:_:_:)"))); + +void valSelf(struct A a, int * __counted_by(len) p __noescape, int len) __attribute__((swift_name("A.valSelf(self:_:_:)"))); + +void refSelf(struct C *c, int * __counted_by(len) p __noescape, int len) __attribute__((swift_name("C.refSelf(self:_:_:)"))); + +int * __counted_by(len) lifetimeBoundSelf(struct A a __lifetimebound, int len) __attribute__((swift_name("A.lifetimeBoundSelf(self:_:)"))); + +void nonescaping(const struct B *d, int * __counted_by(len) p __noescape, int len) __attribute__((swift_name("B.nonescaping(self:_:_:)"))); + +int * __counted_by(len) nonescapingLifetimebound(struct B *d __lifetimebound, int len) __attribute__((swift_name("B.nonescapingLifetimebound(self:_:)"))); + +//--- Inputs/module.modulemap +module Instance { + header "instance.h" +} + +//--- out.expected +@__swiftmacro_So1AV5basic15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public mutating func basic(_ p: inout MutableSpan) { + let len = Int32(exactly: p.count)! + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe basic(_pPtr.baseAddress!, len) + } +} +------------------------------ +@__swiftmacro_So5basic15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "A.basic(self:_:_:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public func basic(_ a: UnsafeMutablePointer!, _ p: inout MutableSpan) { + let len = Int32(exactly: p.count)! + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe basic(a, _pPtr.baseAddress!, len) + } +} +------------------------------ +@__swiftmacro_So1AV3bar15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public mutating func bar(_ p: inout MutableSpan) { + let len = Int32(exactly: p.count)! + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe bar(_pPtr.baseAddress!, len) + } +} +------------------------------ +@__swiftmacro_So7renamed15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "A.bar(self:_:_:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public func renamed(_ a: UnsafeMutablePointer!, _ p: inout MutableSpan) { + let len = Int32(exactly: p.count)! + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe renamed(a, _pPtr.baseAddress!, len) + } +} +------------------------------ +@__swiftmacro_So1AV9constSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public func constSelf(_ p: inout MutableSpan) { + let len = Int32(exactly: p.count)! + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe constSelf(_pPtr.baseAddress!, len) + } +} +------------------------------ +@__swiftmacro_So9constSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "A.constSelf(self:_:_:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public func constSelf(_ a: UnsafePointer!, _ p: inout MutableSpan) { + let len = Int32(exactly: p.count)! + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe constSelf(a, _pPtr.baseAddress!, len) + } +} +------------------------------ +@__swiftmacro_So1AV7valSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public func valSelf(_ p: inout MutableSpan) { + let len = Int32(exactly: p.count)! + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe valSelf(_pPtr.baseAddress!, len) + } +} +------------------------------ +@__swiftmacro_So7valSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "A.valSelf(self:_:_:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public func valSelf(_ a: A, _ p: inout MutableSpan) { + let len = Int32(exactly: p.count)! + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe valSelf(a, _pPtr.baseAddress!, len) + } +} +------------------------------ +@__swiftmacro_So1AV17lifetimeBoundSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(borrow self) @_disfavoredOverload +public func lifetimeBoundSelf(_ len: Int32) -> MutableSpan { + return unsafe _swiftifyOverrideLifetime(MutableSpan(_unsafeStart: unsafe lifetimeBoundSelf(len), count: Int(len)), copying: ()) +} +------------------------------ +@__swiftmacro_So17lifetimeBoundSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "A.lifetimeBoundSelf(self:_:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(borrow a) @_disfavoredOverload +public func lifetimeBoundSelf(_ a: A, _ len: Int32) -> MutableSpan { + return unsafe _swiftifyOverrideLifetime(MutableSpan(_unsafeStart: unsafe lifetimeBoundSelf(a, len), count: Int(len)), copying: ()) +} +------------------------------ +@__swiftmacro_So1CV7refSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public func refSelf(_ p: inout MutableSpan) { + let len = Int32(exactly: p.count)! + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe refSelf(_pPtr.baseAddress!, len) + } +} +------------------------------ +@__swiftmacro_So7refSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "C.refSelf(self:_:_:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public func refSelf(_ c: C!, _ p: inout MutableSpan) { + let len = Int32(exactly: p.count)! + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe refSelf(c, _pPtr.baseAddress!, len) + } +} +------------------------------ +@__swiftmacro_So1BV11nonescaping15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public func nonescaping(_ p: inout MutableSpan) { + let len = Int32(exactly: p.count)! + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe nonescaping(_pPtr.baseAddress!, len) + } +} +------------------------------ +@__swiftmacro_So1BV24nonescapingLifetimebound15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(copy self) @_disfavoredOverload +public mutating func nonescapingLifetimebound(_ len: Int32) -> MutableSpan { + return unsafe _swiftifyOverrideLifetime(MutableSpan(_unsafeStart: unsafe nonescapingLifetimebound(len), count: Int(len)), copying: ()) +} +------------------------------ diff --git a/test/Interop/Cxx/swiftify-import/import-as-instance-method.swift b/test/Interop/Cxx/swiftify-import/import-as-instance-method.swift new file mode 100644 index 0000000000000..04f6ae82a1605 --- /dev/null +++ b/test/Interop/Cxx/swiftify-import/import-as-instance-method.swift @@ -0,0 +1,314 @@ +// REQUIRES: swift_feature_SafeInteropWrappers + +// RUN: %empty-directory(%t) +// RUN: split-file %s %t + +// RUN: %target-swift-frontend -emit-module -plugin-path %swift-plugin-dir -o %t/Test.swiftmodule -I %t/Inputs -enable-experimental-feature SafeInteropWrappers -strict-memory-safety -warnings-as-errors -Xcc -Werror %t/test.swift -cxx-interoperability-mode=default -Xcc -std=c++20 -verify -verify-additional-file %t/Inputs/instance.h -DVERIFY +// RUN: %target-swift-frontend -emit-module -plugin-path %swift-plugin-dir -o %t/Test.swiftmodule -I %t/Inputs -enable-experimental-feature SafeInteropWrappers -strict-memory-safety -warnings-as-errors -Xcc -Werror %t/test.swift -cxx-interoperability-mode=default -Xcc -std=c++20 -dump-macro-expansions +// RUN: env SWIFT_BACKTRACE="" %target-swift-frontend -emit-module -plugin-path %swift-plugin-dir -o %t/Test.swiftmodule -I %t/Inputs -enable-experimental-feature SafeInteropWrappers -strict-memory-safety -warnings-as-errors -Xcc -Werror %t/test.swift -cxx-interoperability-mode=default -Xcc -std=c++20 -dump-macro-expansions +// RUN: env SWIFT_BACKTRACE="" %target-swift-frontend -emit-module -plugin-path %swift-plugin-dir -o %t/Test.swiftmodule -I %t/Inputs -enable-experimental-feature SafeInteropWrappers -strict-memory-safety -warnings-as-errors -Xcc -Werror %t/test.swift -cxx-interoperability-mode=default -Xcc -std=c++20 -dump-macro-expansions 2> %t/out.txt +// RUN: diff -u --strip-trailing-cr %t/out.txt %t/out.expected + +//--- test.swift +import CxxStdlib +import Instance + +func foo(_ p: inout MutableSpan, a: A, aa: inout A, s: IntSpan, cs: ConstIntSpan, asp: AliasingSpan, b: inout baz.B) { + aa.basic(&p) + aa.bar(&p) + a.constSelf(&p) + a.valSelf(&p) + aa.refSelf(&p) + aa.namespaced(&p) + b.decapseman(&p) + baz.bar(&aa, &p) + baz.this(&aa, &p) + + let _: IntSpan = unsafe s.spanSelf() + let _: MutableSpan = unsafe s.spanSelf() + let _: IntSpan = unsafe s.spanConstSelf() + let _: MutableSpan = unsafe s.spanConstSelf() + let _: ConstIntSpan = unsafe cs.constSpanSelf() + let _: Span = unsafe cs.constSpanSelf() + let _: IntSpan = unsafe asp.spanSelf() + let _: MutableSpan = unsafe asp.spanSelf() +#if VERIFY + p.spanSelf() // expected-error{{value of type 'MutableSpan' (aka 'MutableSpan') has no member 'spanSelf'}} +#endif +} + +//--- Inputs/instance.h +#include +#include +#include + +struct A {}; + +using IntSpan = std::span; +using ConstIntSpan = std::span; +using AliasingSpan = std::span; + +void basic(A *a, IntSpan p __noescape) __attribute__((swift_name("A.basic(self:_:)"))); + +void renamed(A *a, IntSpan p __noescape) __attribute__((swift_name("A.bar(self:_:)"))); + +void constSelf(const A *a, IntSpan p __noescape) __attribute__((swift_name("A.constSelf(self:_:)"))); + +void valSelf(A a, IntSpan p __noescape) __attribute__((swift_name("A.valSelf(self:_:)"))); + +void refSelf(A &a, IntSpan p __noescape) __attribute__((swift_name("A.refSelf(self:_:)"))); + +IntSpan spanSelf(IntSpan p __lifetimebound) __attribute__((swift_name("IntSpan.spanSelf(self:)"))); + +const IntSpan spanConstSelf(const IntSpan p __lifetimebound) __attribute__((swift_name("IntSpan.spanConstSelf(self:)"))); + +ConstIntSpan constSpanSelf(ConstIntSpan p __lifetimebound) __attribute__((swift_name("ConstIntSpan.constSpanSelf(self:)"))); + +namespace baz { + void namespaced(A *a, IntSpan p __noescape) __attribute__((swift_name("A.namespaced(self:_:)"))); + struct B {}; + void renamed(A &a, IntSpan p __noescape) __attribute__((swift_name("baz.bar(_:_:)"))); + void that(A &a, IntSpan p __noescape) __attribute__((swift_name("this(_:_:)"))); +} + +void decapseman(baz::B *b, IntSpan p __noescape) __attribute__((swift_name("baz.B.decapseman(self:_:)"))); + +//--- Inputs/module.modulemap +module Instance { + header "instance.h" + export * +} + +//--- out.expected +@__swiftmacro_So1AV5basic15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public mutating func basic(_ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe basic(IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So5basic15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "A.basic(self:_:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public func basic(_ a: UnsafeMutablePointer!, _ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe basic(a, IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So1AV3bar15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public mutating func bar(_ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe bar(IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So7renamed15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "A.bar(self:_:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public func renamed(_ a: UnsafeMutablePointer!, _ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe renamed(a, IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So1AV9constSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public func constSelf(_ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe constSelf(IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So9constSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "A.constSelf(self:_:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public func constSelf(_ a: UnsafePointer!, _ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe constSelf(a, IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So1AV7valSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public func valSelf(_ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe valSelf(IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So7valSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "A.valSelf(self:_:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public func valSelf(_ a: A, _ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe valSelf(a, IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So1AV7refSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public mutating func refSelf(_ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe refSelf(IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So7refSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "A.refSelf(self:_:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public func refSelf(_ a: inout A, _ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe refSelf(&a, IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So1AV10namespaced15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public mutating func namespaced(_ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe namespaced(IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So3bazO10namespaced15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "A.namespaced(self:_:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload + public static func namespaced(_ a: UnsafeMutablePointer!, _ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe namespaced(a, IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So3bazO1BV8InstanceE10decapseman15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public mutating func decapseman(_ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe decapseman(IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So10decapseman15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "baz.B.decapseman(self:_:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public func decapseman(_ b: UnsafeMutablePointer!, _ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe decapseman(b, IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So3bazO8InstanceE3bar15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public static func bar(_ a: inout A, _ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe bar(&a, IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So3bazO7renamed15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "baz.bar(_:_:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload + public static func renamed(_ a: inout A, _ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe renamed(&a, IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So3bazO4this15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload +public static func this(_ a: inout A, _ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe this(&a, IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So3bazO4that15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "this(_:_:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(p: copy p) @_disfavoredOverload + public static func that(_ a: inout A, _ p: inout MutableSpan) { + return unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe that(&a, IntSpan(_pPtr)) + } +} +------------------------------ +@__swiftmacro_So3stdO3__1O0056spanCInt_CUnsignedLong_18446744073709551615_syGJqopasxheV8InstanceE8spanSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(borrow self) @_disfavoredOverload +public func spanSelf() -> MutableSpan { + return unsafe _swiftifyOverrideLifetime(MutableSpan(_unsafeCxxSpan: unsafe spanSelf()), copying: ()) +} +------------------------------ +@__swiftmacro_So8spanSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "IntSpan.spanSelf(self:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(copy p) @_lifetime(p: copy p) @_disfavoredOverload +public func spanSelf(_ p: inout MutableSpan) -> MutableSpan { + return unsafe _swiftifyOverrideLifetime(MutableSpan(_unsafeCxxSpan: unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe spanSelf(IntSpan(_pPtr)) + }), copying: ()) +} +------------------------------ +@__swiftmacro_So3stdO3__1O0056spanCInt_CUnsignedLong_18446744073709551615_syGJqopasxheV8InstanceE13spanConstSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(borrow self) @_disfavoredOverload +public func spanConstSelf() -> MutableSpan { + return unsafe _swiftifyOverrideLifetime(MutableSpan(_unsafeCxxSpan: unsafe spanConstSelf()), copying: ()) +} +------------------------------ +@__swiftmacro_So13spanConstSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "IntSpan.spanConstSelf(self:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(copy p) @_lifetime(p: copy p) @_disfavoredOverload +public func spanConstSelf(_ p: inout MutableSpan) -> MutableSpan { + return unsafe _swiftifyOverrideLifetime(MutableSpan(_unsafeCxxSpan: unsafe p.withUnsafeMutableBufferPointer { _pPtr in + return unsafe spanConstSelf(IntSpan(_pPtr)) + }), copying: ()) +} +------------------------------ +@__swiftmacro_So3stdO3__1O0071span__cxxConstCInt_CUnsignedLong_18446744073709551615_ilHEvDsarBakaEjpbV8InstanceE13constSpanSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(borrow self) @_disfavoredOverload +public func constSpanSelf() -> Span { + return unsafe _swiftifyOverrideLifetime(Span(_unsafeCxxSpan: unsafe constSpanSelf()), copying: ()) +} +------------------------------ +@__swiftmacro_So13constSpanSelf15_SwiftifyImportfMp_.swift +------------------------------ +/// This is an auto-generated wrapper for safer interop +@available(swift, obsoleted: 3, renamed: "ConstIntSpan.constSpanSelf(self:)") @_alwaysEmitIntoClient @available(visionOS 1.0, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *) @_lifetime(copy p) @_disfavoredOverload +public func constSpanSelf(_ p: Span) -> Span { + return unsafe _swiftifyOverrideLifetime(Span(_unsafeCxxSpan: unsafe constSpanSelf(ConstIntSpan(p))), copying: ()) +} +------------------------------ diff --git a/test/Interop/lit.local.cfg b/test/Interop/lit.local.cfg index 0a12b6af32e68..65e4f12046386 100644 --- a/test/Interop/lit.local.cfg +++ b/test/Interop/lit.local.cfg @@ -72,3 +72,5 @@ config.substitutions.insert(0, ( r'%check-c-header-in-clang -std=c11 -Wno-padded -Wno-c++-keyword -Wno-unknown-warning-option -Wno-pre-c11-compat \1' ) )) + +config.substitutions.insert(0, ('%bridging-path', '%swift_src_root%{fs-sep}lib%{fs-sep}ClangImporter%{fs-sep}SwiftBridging'))