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