https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113826
Bug ID: 113826 Summary: string_view::find sometimes not working in constexpr contexts under -fsanitize=undefined Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: ivan.lazaric.gcc at gmail dot com Target Milestone: --- https://godbolt.org/z/qKvecx48W ``` #include <string_view> template <unsigned N> struct fixed_string { char buf[N + 1]{}; consteval fixed_string(char const *s) { for (unsigned i = 0; i != N; ++i) buf[i] = s[i]; buf[N] = 0; } consteval operator std::string_view() const {return {buf, N};} }; template <unsigned N> fixed_string(char const (&)[N]) -> fixed_string<N - 1>; template <fixed_string Str> struct storage { inline static constexpr std::string_view sv{Str}; inline static constexpr bool hasA = sv.find('A') != std::string_view::npos; }; int main(){ using NS = storage<"ABC">; return NS::hasA; } ``` Locally I am using g++ version 14.0.1 When building with flags `-std=c++20` it builds normally When building with flags `-std=c++20 -fsanitize=undefined` it explodes When building with clang with flags `-std=c++20 -fsanitize=undefined` it works normally Error message: ``` In file included from /home/ilazaric/installs/gcc-latest/include/c++/14.0.1/string_view:898, from ex.cpp:1: /home/ilazaric/installs/gcc-latest/include/c++/14.0.1/bits/string_view.tcc: In instantiation of ‘constexpr const bool storage<fixed_string<3>{"ABC"}>::hasA’: ex.cpp:21:16: required from here 21 | return NS::hasA; | ^~~~ ex.cpp:16:46: in ‘constexpr’ expansion of ‘storage<fixed_string<3>{"ABC"}>::sv.std::basic_string_view<char>::find(65, 0)’ /home/ilazaric/installs/gcc-latest/include/c++/14.0.1/bits/string_view.tcc:88:15: error: ‘(((const char*)(& fixed_string<3>{"ABC"}.fixed_string<3>::buf)) != 0)’ is not a constant expression 88 | if (__p) | ^~~ ``` Might be related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104426