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