Skip to content

[cxx-interop] C++ class with [[no_unique_address]] member crashes IRGen #80764

Closed
@ADKaster

Description

@ADKaster

Description

gist.github.com/ADKaster/338e1c4bef075d4ac2feb27336153bd1

Not yet reduced, but @Xazax-hun Mentioned in #80538 (comment) that they have a fix in mind.

Reproduction

git clone [email protected]:LadybirdBrowser/ladybird.git
cd ladybird
swiftly install --use  main-snapshot-2025-04-02
cmake --preset default \
  -DCMAKE_C_COMPILER=$(swiftly use --print-location)/usr/bin/clang \
  -DCMAKE_CXX_COMPILER=$(swiftly use --print-location)/usr/bin/clang++ \
  -DENABLE_SWIFT=ON
ninja -C Build/release TestAKBindings

Stack dump

/home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swiftc -j 32 -num-threads 32 -c -DENABLE_COMPILETIME_FORMAT_CHECK -module-name TestAKBindings -O -g -incremental -color-diagnostics -Xfrontend -sil-verify-none -enable-experimental-feature Extern -Xcc -Wall -Xcc -Wextra -Xcc -fno-exceptions -Xcc -ffp-contract=off -Xcc -Wcast-qual -Xcc -Wformat=2 -Xcc -Wimplicit-fallthrough -Xcc -Wlogical-op -Xcc -Wmissing-declarations -Xcc -Wmissing-field-initializers -Xcc -Wsuggest-override -Xcc -Wno-invalid-offsetof -Xcc -Wno-unknown-warning-option -Xcc -Wno-unused-command-line-argument -Xcc -Werror -Xcc -fconstexpr-steps=16777216 -Xcc -Wmissing-prototypes -Xcc -Wno-implicit-const-int-float-conversion -Xcc -Wno-user-defined-literals -Xcc -Wno-unqualified-std-cast-call -Xcc -fno-semantic-interposition -Xcc -fvisibility-inlines-hidden -Xcc -fstack-protector-strong -Xcc -fstrict-flex-arrays=2 -Xcc -Wno-maybe-uninitialized -Xcc -Wno-shorten-64-to-32 -Xcc -fsigned-char -Xcc -ggnu-pubnames -Xcc -fPIC -Xcc -D_FILE_OFFSET_BITS=64 -Xcc -O2 -Xcc -g1 -Xcc -Wno-overloaded-virtual -parse-as-library -Xcc -ivfsoverlay/home/andrew/ladybird-org/ladybird-browser/Build/release/vfs_overlays/AK_vfs_overlay.yaml -Xcc -std=c++23 -cxx-interoperability-mode=default -output-file-map Lagom/Tests/AK/CMakeFiles/TestAKBindings.dir/RelWithDebInfo/output-file-map.json -I /home/andrew/ladybird-org/ladybird-browser -I /home/andrew/ladybird-org/ladybird-browser/Services -I /home/andrew/ladybird-org/ladybird-browser/Libraries -I /home/andrew/ladybird-org/ladybird-browser/Build/release/Lagom -I /home/andrew/ladybird-org/ladybird-browser/Build/release/Lagom/Services -I /home/andrew/ladybird-org/ladybird-browser/Build/release/Lagom/Libraries -I /home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/include -I /home/andrew/ladybird-org/ladybird-browser/Meta/Lagom/../.. -I /home/andrew/ladybird-org/ladybird-browser/Meta/Lagom/../../Libraries -I /home/andrew/ladybird-org/ladybird-browser/Meta/Lagom/../../Services -I /home/andrew/ladybird-org/ladybird-browser/Build/release -I /home/andrew/ladybird-org/ladybird-browser/Build/release/swift -I /home/andrew/ladybird-org/ladybird-browser/Build/release/Lagom/AK/include /home/andrew/ladybird-org/ladybird-browser/Tests/AK/TestAKBindings.swift
error: compile command failed due to signal 6 (use -v to see invocation)
swift-frontend: /home/build-user/swift/lib/IRGen/GenStruct.cpp:1505: void (anonymous namespace)::ClangRecordLowering::addField(VarDecl *, Size, const FixedTypeInfo &, bool): Assertion `isZeroSized || offset >= NextOffset && "adding fields out of order"' failed.
Please submit a bug report (https://swift.org/contributing/#reporting-bugs) and include the crash backtrace.
Stack dump:
0.      Program arguments: /home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swift-frontend -frontend -c -primary-file /home/andrew/ladybird-org/ladybird-browser/Tests/AK/TestAKBindings.swift -emit-reference-dependencies-path Lagom/Tests/AK/CMakeFiles/TestAKBindings.dir/TestAKBindings.swift.o.swiftdeps -target x86_64-unknown-linux-gnu -disable-objc-interop -cxx-interoperability-mode=default -I /home/andrew/ladybird-org/ladybird-browser -I /home/andrew/ladybird-org/ladybird-browser/Services -I /home/andrew/ladybird-org/ladybird-browser/Libraries -I /home/andrew/ladybird-org/ladybird-browser/Build/release/Lagom -I /home/andrew/ladybird-org/ladybird-browser/Build/release/Lagom/Services -I /home/andrew/ladybird-org/ladybird-browser/Build/release/Lagom/Libraries -I /home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/include -I /home/andrew/ladybird-org/ladybird-browser -I /home/andrew/ladybird-org/ladybird-browser/Libraries -I /home/andrew/ladybird-org/ladybird-browser/Services -I /home/andrew/ladybird-org/ladybird-browser/Build/release -I /home/andrew/ladybird-org/ladybird-browser/Build/release/swift -I /home/andrew/ladybird-org/ladybird-browser/Build/release/Lagom/AK/include -color-diagnostics -Xcc -fcolor-diagnostics -g -debug-info-format=dwarf -dwarf-version=4 -O -D ENABLE_COMPILETIME_FORMAT_CHECK -sil-verify-none -enable-experimental-feature Extern -empty-abi-descriptor -file-compilation-dir /home/andrew/ladybird-org/ladybird-browser/Build/release -Xcc -Wall -Xcc -Wextra -Xcc -fno-exceptions -Xcc -ffp-contract=off -Xcc -Wcast-qual -Xcc -Wformat=2 -Xcc -Wimplicit-fallthrough -Xcc -Wlogical-op -Xcc -Wmissing-declarations -Xcc -Wmissing-field-initializers -Xcc -Wsuggest-override -Xcc -Wno-invalid-offsetof -Xcc -Wno-unknown-warning-option -Xcc -Wno-unused-command-line-argument -Xcc -Werror -Xcc -fconstexpr-steps=16777216 -Xcc -Wmissing-prototypes -Xcc -Wno-implicit-const-int-float-conversion -Xcc -Wno-user-defined-literals -Xcc -Wno-unqualified-std-cast-call -Xcc -fno-semantic-interposition -Xcc -fvisibility-inlines-hidden -Xcc -fstack-protector-strong -Xcc -fstrict-flex-arrays=2 -Xcc -Wno-maybe-uninitialized -Xcc -Wno-shorten-64-to-32 -Xcc -fsigned-char -Xcc -ggnu-pubnames -Xcc -fPIC -Xcc -D_FILE_OFFSET_BITS=64 -Xcc -O2 -Xcc -g1 -Xcc -Wno-overloaded-virtual -Xcc -ivfsoverlay/home/andrew/ladybird-org/ladybird-browser/Build/release/vfs_overlays/AK_vfs_overlay.yaml -Xcc -std=c++23 -no-auto-bridging-header-chaining -module-name TestAKBindings -in-process-plugin-server-path /home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/lib/swift/host/libSwiftInProcPluginServer.so -plugin-path /home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/lib/swift/host/plugins -plugin-path /home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/local/lib/swift/host/plugins -enable-default-cmo -parse-as-library -num-threads 32 -o Lagom/Tests/AK/CMakeFiles/TestAKBindings.dir/TestAKBindings.swift.o
1.      Swift version 6.2-dev (LLVM fd0517f784635fb, Swift 433ca8ea8107057)
2.      Compiling with effective version 5.10
3.      While evaluating request IRGenRequest(IR Generation for file "/home/andrew/ladybird-org/ladybird-browser/Tests/AK/TestAKBindings.swift")
4.      While converting type 'AK.Utf16View' (declared at [/home/andrew/ladybird-org/ladybird-browser/AK/Utf16View.h:63:7 - line:143:1] RangeText="Utf16View {
public:
    using Iterator = Utf16CodePointIterator;

    static bool is_high_surrogate(u16);
    static bool is_low_surrogate(u16);
    static u32 decode_surrogate_pair(u16 high_surrogate, u16 low_surrogate);

    Utf16View() = default;
    ~Utf16View() = default;

    explicit Utf16View(ReadonlySpan<u16> code_units, Endianness endianness = Endianness::Host)
        : m_code_units(code_units)
        , m_endianness(endianness)
    {
    }

    template<size_t Size>
    Utf16View(char16_t const (&code_units)[Size], Endianness endianness = Endianness::Host)
        : m_code_units(
              reinterpret_cast<u16 const*>(&code_units[0]),
              code_units[Size - 1] == u'\0' ? Size - 1 : Size)
        , m_endianness(endianness)
    {
    }

    bool operator==(Utf16View const& other) const { return m_code_units == other.m_code_units; }

    enum class AllowInvalidCodeUnits {
        Yes,
        No,
    };

    ErrorOr<ByteString> to_byte_string(AllowInvalidCodeUnits = AllowInvalidCodeUnits::No) const;
    ErrorOr<String> to_utf8(AllowInvalidCodeUnits = AllowInvalidCodeUnits::No) const;

    bool is_null() const { return m_code_units.is_null(); }
    bool is_empty() const { return m_code_units.is_empty(); }
    size_t length_in_code_units() const { return m_code_units.size(); }
    size_t length_in_code_points() const;

    Endianness endianness() const { return m_endianness; }

    Utf16CodePointIterator begin() const { return { begin_ptr(), m_code_units.size(), m_endianness }; }
    Utf16CodePointIterator end() const { return { end_ptr(), 0, m_endianness }; }

    u16 const* data() const { return m_code_units.data(); }
    char16_t const* char_data() const { return reinterpret_cast<char16_t const*>(data()); }

    ReadonlySpan<u16> span() const { return m_code_units; }

    u16 code_unit_at(size_t index) const;
    u32 code_point_at(size_t index) const;

    size_t code_point_offset_of(size_t code_unit_offset) const;
    size_t code_unit_offset_of(size_t code_point_offset) const;
    size_t code_unit_offset_of(Utf16CodePointIterator const&) const;

    Utf16View substring_view(size_t code_unit_offset, size_t code_unit_length) const;
    Utf16View substring_view(size_t code_unit_offset) const { return substring_view(code_unit_offset, length_in_code_units() - code_unit_offset); }

    Utf16View unicode_substring_view(size_t code_point_offset, size_t code_point_length) const;
    Utf16View unicode_substring_view(size_t code_point_offset) const { return unicode_substring_view(code_point_offset, length_in_code_points() - code_point_offset); }

    bool starts_with(Utf16View const&) const;

    bool validate() const;
    bool validate(size_t& valid_code_units) const;

    bool equals_ignoring_case(Utf16View const&) const;

private:
    u16 const* begin_ptr() const { return m_code_units.data(); }
    u16 const* end_ptr() const { return begin_ptr() + m_code_units.size(); }

    size_t calculate_length_in_code_points() const;

    ReadonlySpan<u16> m_code_units;
    [[no_unique_address]] mutable Optional<size_t> m_length_in_code_points;
    Endianness m_endianness { Endianness::Host };
")
 #0 0x00005ea9a58bf648 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swift-frontend+0x8bb6648)
 #1 0x00005ea9a58bd1ee llvm::sys::RunSignalHandlers() (/home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swift-frontend+0x8bb41ee)
 #2 0x00005ea9a58bfce1 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #3 0x00007bb530e45330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
 #4 0x00007bb530e9eb2c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x00007bb530e9eb2c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #6 0x00007bb530e9eb2c pthread_kill ./nptl/pthread_kill.c:89:10
 #7 0x00007bb530e4527e raise ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x00007bb530e288ff abort ./stdlib/abort.c:81:7
 #9 0x00007bb530e2881b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x00007bb530e3b517 (/lib/x86_64-linux-gnu/libc.so.6+0x3b517)
#11 0x00005ea99e35c69f (anonymous namespace)::ClangRecordLowering::addField(swift::VarDecl*, swift::irgen::Size, swift::irgen::FixedTypeInfo const&, bool) GenStruct.cpp:0:0
#12 0x00005ea99e35c2ea (anonymous namespace)::ClangRecordLowering::collectStructFields(clang::RecordDecl const*) GenStruct.cpp:0:0
#13 0x00005ea99e35b2d9 swift::irgen::TypeConverter::convertStructType(swift::TypeBase*, swift::CanType, swift::StructDecl*) (/home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swift-frontend+0x16522d9)
#14 0x00005ea99e38d0f5 swift::irgen::TypeConverter::convertAnyNominalType(swift::CanType, swift::NominalTypeDecl*) (/home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swift-frontend+0x16840f5)
#15 0x00005ea99e38b872 swift::irgen::TypeConverter::convertType(swift::CanType) (/home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swift-frontend+0x1682872)
#16 0x00005ea99e38b041 swift::irgen::TypeConverter::getTypeEntry(swift::CanType) (/home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swift-frontend+0x1682041)
#17 0x00005ea99e38a7fd swift::irgen::IRGenModule::getTypeInfoForUnlowered(swift::Lowering::AbstractionPattern, swift::CanType) (/home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swift-frontend+0x16817fd)
#18 0x00005ea99e399d63 swift::irgen::emitValueWitnessTable(swift::irgen::IRGenModule&, swift::CanType, bool, bool) (/home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swift-frontend+0x1690d63)
#19 0x00005ea99e2f37ec swift::irgen::emitForeignTypeMetadata(swift::irgen::IRGenModule&, swift::NominalTypeDecl*) (/home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swift-frontend+0x15ea7ec)
#20 0x00005ea99e25bd3a swift::irgen::IRGenerator::emitLazyDefinitions() (/home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swift-frontend+0x1552d3a)
#21 0x00005ea99e0cfbec swift::IRGenRequest::evaluate(swift::Evaluator&, swift::IRGenDescriptor) const (/home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swift-frontend+0x13c6bec)
#22 0x00005ea99e14562c swift::GeneratedModule swift::SimpleRequest<swift::IRGenRequest, swift::GeneratedModule (swift::IRGenDescriptor), (swift::RequestFlags)17>::callDerived<0ul>(swift::Evaluator&, std::integer_sequence<unsigned long, 0ul>) const crtstuff.c:0:0
#23 0x00005ea99e145589 swift::SimpleRequest<swift::IRGenRequest, swift::GeneratedModule (swift::IRGenDescriptor), (swift::RequestFlags)17>::evaluateRequest(swift::IRGenRequest const&, swift::Evaluator&) crtstuff.c:0:0
#24 0x00005ea99e0d9f44 swift::IRGenRequest::OutputType swift::Evaluator::getResultUncached<swift::IRGenRequest, swift::IRGenRequest::OutputType swift::evaluateOrFatal<swift::IRGenRequest>(swift::Evaluator&, swift::IRGenRequest)::'lambda'()>(swift::IRGenRequest const&, swift::IRGenRequest::OutputType swift::evaluateOrFatal<swift::IRGenRequest>(swift::Evaluator&, swift::IRGenRequest)::'lambda'()) crtstuff.c:0:0
#25 0x00005ea99e0d2168 swift::performIRGeneration(swift::FileUnit*, swift::IRGenOptions const&, swift::TBDGenOptions const&, std::unique_ptr<swift::SILModule, std::default_delete<swift::SILModule>>, llvm::StringRef, swift::PrimarySpecificPaths const&, llvm::StringRef, llvm::GlobalVariable**) (/home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swift-frontend+0x13c9168)
#26 0x00005ea99dc43936 generateIR(swift::IRGenOptions const&, swift::TBDGenOptions const&, std::unique_ptr<swift::SILModule, std::default_delete<swift::SILModule>>, swift::PrimarySpecificPaths const&, llvm::StringRef, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, llvm::GlobalVariable*&, llvm::ArrayRef<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>) FrontendTool.cpp:0:0
#27 0x00005ea99dc3f275 performCompileStepsPostSILGen(swift::CompilerInstance&, std::unique_ptr<swift::SILModule, std::default_delete<swift::SILModule>>, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, int&, swift::FrontendObserver*) FrontendTool.cpp:0:0
#28 0x00005ea99dc3dd42 swift::performCompileStepsPostSema(swift::CompilerInstance&, int&, swift::FrontendObserver*) (/home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swift-frontend+0xf34d42)
#29 0x00005ea99dc4fb5a withSemanticAnalysis(swift::CompilerInstance&, swift::FrontendObserver*, llvm::function_ref<bool (swift::CompilerInstance&)>, bool) FrontendTool.cpp:0:0
#30 0x00005ea99dc40e0e performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) FrontendTool.cpp:0:0
#31 0x00005ea99dc3ff3f swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) (/home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swift-frontend+0xf36f3f)
#32 0x00005ea99d9d0ffa swift::mainEntry(int, char const**) (/home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swift-frontend+0xcc7ffa)
#33 0x00007bb530e2a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#34 0x00007bb530e2a28b call_init ./csu/../csu/libc-start.c:128:20
#35 0x00007bb530e2a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
#36 0x00005ea99d9cfff5 _start (/home/andrew/ladybird-org/swift-test-apps/swift-DEVELOPMENT-SNAPSHOT-2025-04-11-a-ubuntu2404/usr/bin/swift-frontend+0xcc6ff5)

Expected behavior

No crash :)

Environment

Swift version 6.2-dev (LLVM fd0517f784635fb, Swift 433ca8e)
Target: x86_64-unknown-linux-gnu
Build config: +assertions

Additional information

No response

Metadata

Metadata

Assignees

Labels

bugA deviation from expected or documented behavior. Also: expected but undesirable behavior.crashBug: A crash, i.e., an abnormal termination of softwaretriage neededThis issue needs more specific labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions