https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109180

            Bug ID: 109180
           Summary: Explicit template instantiation doesn't work for
                    constexpr destructors on arm32 when optimizations are
                    enabled
           Product: gcc
           Version: 12.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: idhameed at protonmail dot com
  Target Milestone: ---

Example (compile with "g++ -std=c++20 -O -c"):

===========================================

template <typename t>
struct record {
    constexpr ~record() { }
};

inline record<char>
return_record() { return {}; }

template record<char>::~record();

===========================================

Compiler Explorer: https://godbolt.org/z/j37rvr961

GCC 10+ targeting 32-bit ARM won't emit any symbols for record<char>::~record
when using most -O levels (-O, -O2, -O3, -Ofast, -Og). Using -fno-inline--or
placing the explicit instantiation of record<char>::~record above the
definition of return_record--works around this bug and causes a symbol for
record<char>::~record to be emitted, as I'd expect. x86-64 GCC doesn't have
this problem.

The original, non-minimized problem I encountered: GCC 12.2.0 as a
cross-compiler on an x86-64 host targeting arm-linux-gnueabihf can't be used to
compile and link LLVM 15's libc++, because libc++'s implementation of
std::basic_string has code that fits the aformentioned pattern--there's an
overload of `std::__1::literals::string_literals::operator "" s` that returns a
basic_string<char>. I tried the release/15.x branch of llvm-project at commit
92e7ef99303f8f367f279ccfa2393e4b96db915a.

Reply via email to