ldionne accepted this revision.
ldionne added a comment.
This revision is now accepted and ready to land.

The libc++ changes are reasonable. We could discuss more around how to handle 
C++03 in `__libcpp_is_constant_evaluated` but I don't think it's worth delaying 
this patch for that.



================
Comment at: libcxx/include/__type_traits/is_constant_evaluated.h:31
+  return false;
+#endif
 }
----------------
hazohelet wrote:
> 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
This explanation makes sense to me. I think it's reasonable to return `false` 
unconditionally in C++03 mode.


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

Reply via email to