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

            Bug ID: 120825
           Summary: Constexpr evaluation fails with the ub sanitizer
           Product: gcc
           Version: 13.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: addmlbx at gmail dot com
  Target Milestone: ---

Usage of the undefined behaviour sanitizer causes failure of the evaluation of
the constexpr function.

Code below, if put in the file `file.cpp`, compiles without errors when command
`g++ -Wall -Wextra -Wpedantic -std=c++20 file.cpp` is used, but compilation
fails if command `g++ -Wall -Wextra -Wpedantic -std=c++20 -fsanitize=undefined
file.cpp` is used (fails at std::string_view::find at bits/string_view.tcc:66
when pointer __first is compared to null)


```c++
#include <array>
#include <cstddef>
#include <string_view>

struct S {
    static constexpr std::array kNullTerminatedCharsArray =
std::to_array("abc");
    static constexpr std::string_view kStr{kNullTerminatedCharsArray.data()};
};

int main() {
    [[maybe_unused]] constexpr size_t pos = S::kStr.find("ab");
}
```

Possible error:

In file included from /usr/include/c++/13/string_view:905,
                 from file.cpp:3:
/usr/include/c++/13/bits/string_view.tcc: In function ‘int main()’:
file.cpp:11:57:   in ‘constexpr’ expansion of
‘S::kStr.std::basic_string_view<char>::find(((const char*)"ab"), 0)’
/usr/include/c++/13/string_view:462:26:   in ‘constexpr’ expansion of ‘((const
std::basic_string_view<char>*)this)->std::basic_string_view<char>::find(__str,
__pos, std::char_traits<char>::length(__str))’
/usr/include/c++/13/bits/string_view.tcc:66:16: error: ‘(((const char*)(&
S::kNullTerminatedCharsArray.std::array<char, 4>::_M_elems)) == 0)’ is not a
constant expression
   66 |           if (!__first)
      |                ^~~~~~~

Used gcc is g++ (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0

Reply via email to