https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106889
Bug ID: 106889 Summary: __builtin_strlen fails for some constexpr constructs Product: gcc Version: 10.4.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: m.cencora at gmail dot com Target Milestone: --- Compiling following program on any gcc version, with C++14 or newer standard fails with "'__builtin_strlen(...)' is not a constant expression" for some of the static asserts. It compiles successfuly on clang. g++ -std=c++14 constexpr unsigned constexpr_strlen(const char* str) { #ifdef WORKAROUND if (!__builtin_constant_p(str)) { unsigned i = 0; while (str[i] != '\0') { ++i; } return i; } #endif return __builtin_strlen(str); } struct StaticString { constexpr StaticString(const char (&src)[4]) : buf{src[0], src[1], src[2], src[3]} {} constexpr const char* data() const { return &buf[0]; } char buf[4]; }; constexpr StaticString createStaticString() { return {"foo"}; } constexpr const char *s1 = "foo"; constexpr const char s2[] = "foo"; constexpr StaticString s3{"foo"}; constexpr StaticString s4 = s2; constexpr StaticString s5 = s4; constexpr StaticString s6 = createStaticString(); void test() { constexpr const char *s7 = "foo"; constexpr const char s8[] = "foo"; constexpr StaticString s9{"foo"}; constexpr StaticString s10 = s8; constexpr StaticString s11 = s10; constexpr StaticString s12 = createStaticString(); static constexpr const char *s13 = "foo"; static constexpr const char s14[] = "foo"; static constexpr StaticString s15{"foo"}; static constexpr StaticString s16 = s14; static constexpr StaticString s17 = s6; static constexpr StaticString s18 = createStaticString(); static_assert(constexpr_strlen(s1) == 3, ""); static_assert(constexpr_strlen(s2) == 3, ""); static_assert(constexpr_strlen(s3.data()) == 3, ""); static_assert(constexpr_strlen(s4.data()) == 3, ""); // ERROR static_assert(constexpr_strlen(s5.data()) == 3, ""); // ERROR static_assert(constexpr_strlen(s6.data()) == 3, ""); // ERROR static_assert(constexpr_strlen(s7) == 3, ""); static_assert(constexpr_strlen(s8) == 3, ""); // ERROR static_assert(constexpr_strlen(s9.data()) == 3, ""); // ERROR static_assert(constexpr_strlen(s10.data()) == 3, ""); // ERROR static_assert(constexpr_strlen(s11.data()) == 3, ""); // ERROR static_assert(constexpr_strlen(s12.data()) == 3, ""); // ERROR static_assert(constexpr_strlen(s13) == 3, ""); static_assert(constexpr_strlen(s14) == 3, ""); static_assert(constexpr_strlen(s15.data()) == 3, ""); static_assert(constexpr_strlen(s16.data()) == 3, ""); // ERROR static_assert(constexpr_strlen(s17.data()) == 3, ""); // ERROR static_assert(constexpr_strlen(s18.data()) == 3, ""); // ERROR }