[PATCH] D105127: Implement P1401R5
Richard Smith - zygoloid via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 30 14:53:35 PDT 2021
rsmith added a comment.
P1401R5 points out that we get `noexcept(bool)` wrong in the opposite direction, permitting conversions to `bool` that we are supposed to reject. While that rule didn't change as part of P1401R5, it'd be nice to handle it as part of dealing with that paper.
================
Comment at: clang/lib/Sema/SemaExprCXX.cpp:3929
+
+ if (IsConstexpr && !LangOpts.CPlusPlus2b && !CondExpr->isValueDependent()) {
+ llvm::APSInt Value(/*BitWidth*/ 1);
----------------
I think we should apply this retroactively, even though it wasn't moved as a DR. All other implementations already behave this way across all language modes, and it's just not reasonable to reject conversions in the condition of an `if constexpr` that are accepted in the condition of an `if` -- this seems like an obvious language defect even if the C++ committee haven't officially voted it to be one yet.
Separately I've asked on the committee reflectors if we can officially treat this as a DR, given the implementation consensus.
================
Comment at: clang/lib/Sema/SemaExprCXX.cpp:3935
+ ExprResult E = PerformContextuallyConvertToBool(CondExpr);
+ if (!IsConstexpr || !E.isUsable() || E.get()->isValueDependent())
+ return E;
----------------
Please use `E.isInvalid()` instead of `!E.isUsable()` unless you anticipate and intend to handle the valid-but-null case (which is unusable but not invalid).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D105127/new/
https://reviews.llvm.org/D105127
More information about the cfe-commits
mailing list