Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
ADKaster opened this issue Apr 11, 2025 · 3 comments · May be fixed by #80786
Open

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

ADKaster opened this issue Apr 11, 2025 · 3 comments · May be fixed by #80786
Assignees
Labels
bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. crash Bug: A crash, i.e., an abnormal termination of software triage needed This issue needs more specific labels

Comments

@ADKaster
Copy link
Contributor

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

@ADKaster ADKaster added bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. crash Bug: A crash, i.e., an abnormal termination of software triage needed This issue needs more specific labels labels Apr 11, 2025
@Xazax-hun Xazax-hun self-assigned this Apr 11, 2025
@Xazax-hun
Copy link
Contributor

Thanks for the report! Just to double check, the crash goes away if you remove [[no_unique_address]] right?

@ADKaster
Copy link
Contributor Author

ADKaster commented Apr 11, 2025

That's correct, without the attribute the code compiles as expected

Xazax-hun pushed a commit that referenced this issue Apr 12, 2025
The Swift compiler was not prepared for the case where a field is stored
in the padding of the previous field.

Fixes #80764
Xazax-hun pushed a commit that referenced this issue Apr 13, 2025
Swift does not support storing fields in the padding of the previous
fields just yet, so let's not import fields like that from C++.
Represent them as opaque blobs instead.

Fixes #80764
Xazax-hun pushed a commit that referenced this issue Apr 13, 2025
Swift does not support storing fields in the padding of the previous
fields just yet, so let's not import fields like that from C++.
Represent them as opaque blobs instead.

Fixes #80764
Xazax-hun pushed a commit that referenced this issue Apr 13, 2025
Swift does not support storing fields in the padding of the previous
fields just yet, so let's not import fields like that from C++.
Represent them as opaque blobs instead.

Fixes #80764
@ADKaster
Copy link
Contributor Author

fwiw in my project this can be worked around by use of a NO_UNIQUE_ADDRESS type macro. I already am going to need one of those for when we start supporting windows (thanks MSVC) due to the snafu around [[msvc::no_unique_address]]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. crash Bug: A crash, i.e., an abnormal termination of software triage needed This issue needs more specific labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants