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

Pedro Alves <palves at redhat dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |palves at redhat dot com

--- Comment #4 from Pedro Alves <palves at redhat dot com> ---
Meanwhile, maybe this could be punted to the library, making use of
__builtin_constant as a building block?  I don't know what guarantees
__builtin_constant officially gives in constexpr, but at least the below
compiles fine with GCC 7, in both -std=gnu++14 and -std=gnu++17 modes.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <string>

constexpr size_t constexpr_strlen(const char* s) {
  return *s ? constexpr_strlen (s + 1) + 1 : 0;
}

template <class T>
struct ce_char_traits : std::char_traits<T> {
    using char_type = typename std::char_traits<T>::char_type;

    static constexpr std::size_t length(const char_type* s) noexcept {
      if (__builtin_constant_p (s))
        return constexpr_strlen (s);

      return __builtin_strlen (s);
    }
};

static_assert (ce_char_traits<char>::length ("") == 0);
static_assert (ce_char_traits<char>::length ("hello") == 5);
static_assert (ce_char_traits<char>::length ("he\0llo") == 2);

static const char array[] = "foo";
static_assert (ce_char_traits<char>::length (array) == 3);

Reply via email to