From 50bc6fb9d938a7be36b426e7031febfaa8ebcf25 Mon Sep 17 00:00:00 2001 From: Jonne Ransijn Date: Fri, 11 Apr 2025 15:06:20 +0200 Subject: [PATCH] AK: Loosen the restrictions on non-copyable/non-movable containers If a type is non-move constructible but move assignable, its container type may still be move assignable. Similairly, if a type is non-copy constructible but copy assignable, its container type may still be copy assignable. --- AK/Noncopyable.h | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/AK/Noncopyable.h b/AK/Noncopyable.h index a2a7e775937..e5b0fcdc180 100644 --- a/AK/Noncopyable.h +++ b/AK/Noncopyable.h @@ -26,14 +26,14 @@ public: \ c(c const&) = default; \ c& operator=(c const&) = default -#define AK_MAKE_CONDITIONALLY_NONMOVABLE(c, ...) \ -public: \ - c(c&&) \ - requires(!(AK::Detail::IsMoveConstructible __VA_ARGS__)) \ - = delete; \ - c& operator=(c&&) \ - requires(!(AK::Detail::IsMoveConstructible __VA_ARGS__) \ - || !(AK::Detail::IsDestructible __VA_ARGS__)) \ +#define AK_MAKE_CONDITIONALLY_NONMOVABLE(c, ...) \ +public: \ + c(c&&) \ + requires(!(AK::Detail::IsMoveConstructible __VA_ARGS__)) \ + = delete; \ + c& operator=(c&&) \ + requires(!((AK::Detail::IsMoveConstructible __VA_ARGS__) || (AK::Detail::IsMoveAssignable __VA_ARGS__)) \ + || !(AK::Detail::IsDestructible __VA_ARGS__)) \ = delete #define AK_MAKE_CONDITIONALLY_MOVABLE(c, T) \ @@ -41,14 +41,14 @@ public: \ c(c&&) = default; \ c& operator=(c&&) = default -#define AK_MAKE_CONDITIONALLY_NONCOPYABLE(c, ...) \ -public: \ - c(c const&) \ - requires(!(AK::Detail::IsCopyConstructible __VA_ARGS__)) \ - = delete; \ - c& operator=(c const&) \ - requires(!(AK::Detail::IsCopyConstructible __VA_ARGS__) \ - || !(AK::Detail::IsDestructible __VA_ARGS__)) \ +#define AK_MAKE_CONDITIONALLY_NONCOPYABLE(c, ...) \ +public: \ + c(c const&) \ + requires(!(AK::Detail::IsCopyConstructible __VA_ARGS__)) \ + = delete; \ + c& operator=(c const&) \ + requires(!((AK::Detail::IsCopyConstructible __VA_ARGS__) || (AK::Detail::IsCopyAssignable __VA_ARGS__)) \ + || !(AK::Detail::IsDestructible __VA_ARGS__)) \ = delete #define AK_MAKE_CONDITIONALLY_COPYABLE(c, ...) \