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

            Bug ID: 110158
           Summary: Cannot use union with std::string inside in constant
                    expression
           Product: gcc
           Version: 13.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: fchelnokov at gmail dot com
  Target Milestone: ---

This program

constexpr bool f() {
    union U{
        std::string s;
        constexpr ~U(){ s.~basic_string(); }
    } u{};
    return true;
}

static_assert( f() );

is accepted in MSVC and Clang with libc++. But in GCC it produces the error:

error: non-constant condition for static assertion
   in 'constexpr' expansion of 'f()'
   in 'constexpr' expansion of '(& u)->f()::U::~U()'
   in 'constexpr' expansion of
'((f()::U*)this)->f()::U::s.std::__cxx11::basic_string<char>::~basic_string()'
/opt/compiler-explorer/gcc-13.1.0/include/c++/13.1.0/bits/basic_string.h:803:19:
  in 'constexpr' expansion of
'((std::__cxx11::basic_string<char>*)this)->std::__cxx11::basic_string<char>::_M_dispose()'
error: accessing 'std::__cxx11::basic_string<char>::<unnamed
union>::_M_allocated_capacity' member instead of initialized
'std::__cxx11::basic_string<char>::<unnamed union>::_M_local_buf' member in
constant expression

Online demo: https://gcc.godbolt.org/z/bbf4Yo3v9

Reply via email to