hazohelet marked an inline comment as done. hazohelet added inline comments.
================ Comment at: libcxx/include/__type_traits/is_constant_evaluated.h:31 + return false; +#endif } ---------------- philnik wrote: > Mordante wrote: > > hazohelet wrote: > > > Mordante wrote: > > > > Why is this needed? Does this mean the builtin will fail in C++03 mode? > > > `__libcpp_is_constant_evaluated` always returns false under C++03 or > > > earlier, where constexpr isn't available. This is a fix to run libc++ > > > tests without seeing warnings from clang with this patch. > > > (Live demo: https://godbolt.org/z/oszebM5o5) > > I see can you add a comment in that regard? To me it looks like the builtin > > fails in C++03, where returning false indeed is always the right answer. > https://godbolt.org/z/bafeeY7b7 shows that > `__builtin_is_constant_evaluated()` doesn't always return false in C++03, so > this change seems wrong to me. This is NFC. The problem is that `__libcpp_is_constant_evaluated()` has different semantics from `__builtin_is_constant_evaluated()` in C++03. The cause of this tautological-falsity here is whether `__libcpp_is_constant_evaluated()` is `constexpr`-qualified or not. `_LIBCPP_CONSTEXPR` macro expands to `constexpr` since C++11, but in pre-C++11 mode, it expands to nothing. So in C++03 mode this function is something like `bool __libcpp_is_constant_evaluated() { return __builtin_is_constant_evaluated(); }`, where it is tautologically-false because it is not constexpr-qualified. As you mentioned, `__builtin_is_constant_evaluated` does not change its semantics depending on C++ versions. However, `__libcpp_is_constant_evaluated()` always returns false in C++03 as in https://godbolt.org/z/oszebM5o5 CHANGES SINCE LAST ACTION https://reviews.llvm.org/D155064/new/ https://reviews.llvm.org/D155064 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits