https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116572
Bug ID: 116572 Summary: Using a std::string passed to a virtual member function of a side-casted pointer spuriously triggers UBSan on 14.2.0, and ICEs on trunk Product: gcc Version: 14.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: eddiejnolan at gmail dot com Target Milestone: --- Given the following code, built with -std=c++20 -O3 -fsanitize=undefined: #include <string> int main() { struct VirtualBase { virtual ~VirtualBase() {} }; struct VirtualBase2 { virtual void foo(std::string s) const = 0; }; struct MultiBase : VirtualBase, VirtualBase2 { void foo(std::string s) const override { (void)s.find("X"); } } multibase{}; VirtualBase* p{&multibase}; dynamic_cast<VirtualBase2*>(p)->foo("Y"); } GCC 14.2.0 compiles the program but produces the following UBSan report: p\x13@:4203136: runtime error: execution reached an unreachable program point (I'm using \x13 to substitute for an unprintable ASCII character in the original output). GCC trunk fails to compile entirely with the following internal compiler error: <source>:18:1: internal compiler error: in release_body, at cgraph.cc:1865 18 | } | ^ 0x27ccba5 diagnostic_context::diagnostic_impl(rich_location*, diagnostic_metadata const*, int, char const*, __va_list_tag (*) [1], diagnostic_t) ???:0 0x27e0145 internal_error(char const*, ...) ???:0 0xa7fe58 fancy_abort(char const*, int, char const*) ???:0 0xeb4b4b symbol_table::finalize_compilation_unit() ???:0 Please submit a full bug report, with preprocessed source (by using -freport-bug). Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions. Compiler returned: 1 Compiler explorer link: https://godbolt.org/z/Gcc48qEMn