List of issues preventing moving forward on moving Swift 6.0 support out of an experimental state:
Swift issues:
-
Please backport d8352e93c1c8042d9166eab3d76d6c07ef585b6d swiftlang/llvm-project#8998
Details: Swift's version of LLVM is missing the fix for [Clang] ICE in CheckPointerToMemberOperands passing decltype of lambda llvm/llvm-project#53815. This means that any assertions build of llvm from the swift open source project cannot build our code. Snapshot builds are released with assertions on.
Workaround: Build swift from source on Linux without llvm assertions, or use macOS.
PR: 🍒 [Clang] [Sema] Handle placeholders in '.*' expressions (#83103) swiftlang/llvm-project#9038
Fixed in Swift 6.0.0 release
-
Details: It is not currently possible to return a swift optional of a small C++ type back to C++. The compiler and the generated bridging header disagree on how that is supposed to be done.
Workaround: Don't use Optional, use a return type that forces the C++ type to be heap allocated. Array is one alternative.
-
Details: Swift's clang module map for libstdc++ contains cycles when
<execution>is included. See https://forums.swift.org/t/swift-5-9-release-on-ubuntu-22-04-fails-to-build-std-module/67659Workaround: Edit
<prefix>/lib/swift/linux/libstdcxx.hto comment out the#include <execution>line.PR: [cxx-interop] Disable c++ execution header with libstdcxx versions >= 11 swiftlang/swift#75662 (Just a workaround, not a fix)
6.0 Backport: 🍒 [cxx-interop] Disable c++ execution header with libstdcxx versions >= 11 swiftlang/swift#75971
Fixed in swiftlang/swift:main and release/6.0, but not in 6.0.0 or 6.0.1 -
Interop: Cannot return
swift::Optional<swift::String>from C++ function swiftlang/swift#76024Details: Returning binding types
swift::Optional<T>orswift::Stringfrom a C++ function is not supportedWorkaround: Return std:: types?
-
Swift cannot import libstdc++-13 chrono header in C++23 mode swiftlang/swift#76809
Details: Swift 6.0 cannot import libstdc++-13 or higher
<chrono>header.Workaround: Use libc++ or a lower libstdc++ version. libstdc++-13 is default on Ubuntu 24.04 LTS.
Fixed in swiftlang/swift:main as of Oct 18, 2024
-
Details: SIL verifier crash when trying to compare unsafe reference types by pointer
Workaround: Disable SIL verification (!! yikes)
Fixed in [cxx-interop] Relax a SILVerifier assertion for immortal reference types swiftlang/swift#81614 -
Details: SWIFT_UNSAFE_REFERENCE types with getters/setters for bitfields crash the frontend
Workaround: ... don't use SWIFT_UNSAFE_REFERENCE? unsure. Need guidance
Fixed in [cxx-interop] Do not create mutating properties for classes swiftlang/swift#80197 -
Details:
Vector<u32, 2>is not recognized asCxxConvertibleToContainer
Workaround: Treat it as a sequence instead, and any transfer to a swift type requires manual copying of elements -
Enabling cxx interop on Arch with GCC 15 causes lots of errors swiftlang/swift#81774
Details: Swift fails to import clang modules with
#include <math.h>with libstdc++-15 installed.Workaround: None (!!)
CMake issues:
-
https://gitlab.kitware.com/cmake/cmake/-/issues/26174
Details: Swift + Ninja doesn't respect CMAKE_OSX_DEPLOYMENT_TARGET. This results in a mismatched LC_BUILD_VERSION on swift and c++ object files, spamming the console with warnings.
Workaround:
# FIXME: https://gitlab.kitware.com/cmake/cmake/-/issues/26174 if (APPLE) set(CMAKE_Swift_COMPILER_TARGET "${CMAKE_SYSTEM_PROCESSOR}-apple-macosx${CMAKE_OSX_DEPLOYMENT_TARGET}") endif() -
https://gitlab.kitware.com/cmake/cmake/-/issues/26175
Details: With CMP0157 enabled, swiftc does not set install_name directory to "@rpath" per CMAKE_INSTALL_NAME_DIR
Workaround:
# FIXME: https://gitlab.kitware.com/cmake/cmake/-/issues/26175 if (APPLE) add_custom_command(TARGET LibGfx POST_BUILD COMMAND install_name_tool -id @rpath/liblagom-gfx.0.dylib "$<TARGET_FILE:LibGfx>" ) endif() PR: https://gitlab.kitware.com/cmake/cmake/-/merge_requests/9692. Merged Aug 2, 2024 to be backported to CMake 3.29, 3.30.
-
https://gitlab.kitware.com/cmake/cmake/-/issues/26195
Details: Imported targets from dependencies can have INTERFACE_COMPILE_OPTIONS or INTERFACE_LINK_OPTIONS that swiftc doesn't understand.
Workaround: Swizzle the flags just after import, for every single imported library.
Ladybird issues:
Nice-to-have:
Open questions:
-
Unclear how to pass view types or byte slices to swift without creating a copy.
- We will want to be passing untrusted Strings, or c++-owned Spans of bytes to swift for it to crunch on and return some structured data. It's not clear how to inform swift about this without copying the data (at least) once.
I was not able to massage swift into interpreting our String and StringView types as 'CxxConvertibleToContainer' or 'CxxRandomAccessContainer' types. Likely because they are actually immutable?
-
Unclear how to convince Swift that our types are just as good as std:: ones.
- AK::Optional
- AK::HashTable/HashMap
- AK::Time
- more?
-
How to integrate with our garbage collector? https://forums.swift.org/t/ladybird-browser-and-swift-garbage-collection/76084