9 Commits

Author SHA1 Message Date
Amy Huang
f9a1478200
Reapply "[Clang][C++23] Implement P2448R2 ..." (#85136) (#85145)
This reverts commit 003e292f9895a9cf4e30688269efa668d1fcbb09 because
there were dependent changes in the codebase that now fail.
2024-03-13 23:15:01 +00:00
Amy Huang
003e292f98
Revert "[Clang][C++23] Implement P2448R2 ..." (#85136)
Revert "[Clang][C++23] Implement P2448R2: Relaxing some constexpr
restrictions (#77753)"

This reverts commit 99500e8c08a4d941acb8a7eb00523296fb2acf7a because it
causes a behavior change for std=c++20. See
https://github.com/llvm/llvm-project/pull/77753.
2024-03-13 21:53:38 +00:00
Mariya Podchishchaeva
99500e8c08
[Clang][C++23] Implement P2448R2: Relaxing some constexpr restrictions (#77753)
Per
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2448r2.html
function/constructor/destructor can be marked `constexpr` even though it
never produces a constant expression.
Non-literal types as return types and parameter types of functions
marked `constexpr` are also allowed.
Since this is not a DR, the diagnostic messages are still preserved for
C++ standards older than C++23.
2024-03-07 09:36:50 +01:00
Shafik Yaghmour
7887af027e Fix build bots due to missing a commit thay change 2b to 23
Fixing build bot breaks due to b4692f29263006c7ea519c7b11c9082384f0af53
2023-05-04 11:33:58 -07:00
Shafik Yaghmour
b4692f2926 [Clang] Updating handling of defaulted comparison operators to reflect changes from P2448R2
Prior to P2448R2 we were more aggressive in diagnosing ill-formed
constexpr functions. Many of these restrictions were relaxed and now it
is not required for defaulted comparison operators to call constexpr
functions.

This behavior is extended to before C++23 and diagnostic for it's use
can be enabled w/ -pedantic or -Wc++2b-default-comp-relaxed-constexpr

This fixes: https://github.com/llvm/llvm-project/issues/61238

Differential Revision: https://reviews.llvm.org/D146090
2023-05-04 11:07:16 -07:00
Roy Jacobson
6a763343e2 [Clang] Reject in-class defaulting of previously declared comparison operators
Comparison operators are not allowed to be defaulted if they were previously declared outside the class.
Pretty low-impact, but it's nice to reject this without a linking error.
Fixes https://github.com/llvm/llvm-project/issues/51227.

Reviewed By: #clang-language-wg, ChuanqiXu

Differential Revision: https://reviews.llvm.org/D141803
2023-01-17 22:29:51 +02:00
Richard Smith
1f3f8c369a PR44721: Don't consider overloaded operators for built-in comparisons
when building a defaulted comparison.

As a convenient way of asking whether `x @ y` is valid and building it,
we previouly always performed overload resolution and built an
overloaded expression, which would both end up picking a builtin
operator candidate when given a non-overloadable type. But that's not
quite right, because it can result in our finding a user-declared
operator overload, which we should never do when applying operators
non-overloadable types.

Handle this more correctly: skip overload resolution when building
`x @ y` if the operands are not overloadable. But still perform overload
resolution (considering only builtin candidates) when checking validity,
as we don't have any other good way to ask whether a binary operator
expression would be valid.
2020-01-30 17:16:50 -08:00
Richard Smith
4a4e90a823 [c++20] Compute exception specifications for defaulted comparisons.
This requires us to essentially fully form the body of the defaulted
comparison, but from an unevaluated context. Naively this would require
generating the function definition twice; instead, we ensure that the
function body is implicitly defined before performing the check, and
walk the actual body where possible.
2019-12-15 22:02:31 -08:00
Richard Smith
5253d9138e [c++20] Determine whether a defaulted comparison should be deleted or
constexpr.
2019-12-06 16:32:48 -08:00