Question about __builtin_strlen and constexpr

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Short version: Is __builtin_strlen constexpr? or Where could I find a specification of builtin functions?


I'm using gcc with libc++ from LLVM and have got a problem with following code:

#include <string_view>
constexpr bool test() {
    const char s1[] = "mave";
    std::string_view s2(s1);
    return true;
}
int main() {
    static_assert(test());
}


Error message was:
$ g++ -nostdinc++ -I/home/yiyan/.local/include/c++/v1 -nodefaultlibs -lc++ -lc++abi -lm -lc -lgcc_s -lgcc -std=c++17 --compile -o /dev/null 1.cc
1.cc: In function 'int main()':
1.cc:8:23: error: non-constant condition for static assertion
    8 |     static_assert(test());
      |                   ~~~~^~
In file included from /home/yiyan/.local/include/c++/v1/string_view:175,
                 from 1.cc:1:
1.cc:8:23:   in 'constexpr' expansion of 'test()'
1.cc:4:27:   in 'constexpr' expansion of 's2.std::__1::basic_string_view<char>::basic_string_view(((const char*)(& s1)))'
/home/yiyan/.local/include/c++/v1/string_view:238:46:   in 'constexpr' expansion of 'std::__1::char_traits<char>::length(__s)'
/home/yiyan/.local/include/c++/v1/__string:217:69: error: '__builtin_strlen(((const char*)(& s1)))' is not a constant expression
  217 |     length(const char_type* __s)  _NOEXCEPT {return __builtin_strlen(__s);}
      |                                                     ~~~~~~~~~~~~~~~~^~~~~



It seems to be caused by __builtin_strlen being not constexpr, and I tried to get a repro as this:
const char s[] = "";
constexpr int test(const char *s) {
    return __builtin_strlen(s);
}
int main() {
    static_assert(!test(s));
    return 0;
}

In this case gcc compiled successfully and looks like __builtin_strlen is constexpr, so I'm a little bit confused.
So I wonder where could I find a specification of builtin functions and how should I address this issue.

Best,
Yichen




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux