From 80e61985632b59acb10a9cf384c7942b2d9bd27d Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Mon, 14 Feb 2022 17:43:49 +0330 Subject: [PATCH] AK: Conditionally disable a few variant ctors/assignments We shouldn't let copy/move ctors or assignments be instantiated if the assignee type does not have a copy/move constructor (even if they're not used anywhere). --- AK/Variant.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/AK/Variant.h b/AK/Variant.h index 63cc349d19..8425f79f7c 100644 --- a/AK/Variant.h +++ b/AK/Variant.h @@ -129,13 +129,13 @@ struct VariantConstructTag { template struct VariantConstructors { - ALWAYS_INLINE VariantConstructors(T&& t) + ALWAYS_INLINE VariantConstructors(T&& t) requires(requires { T(move(t)); }) { internal_cast().clear_without_destruction(); internal_cast().set(move(t), VariantNoClearTag {}); } - ALWAYS_INLINE VariantConstructors(const T& t) + ALWAYS_INLINE VariantConstructors(const T& t) requires(requires { T(t); }) { internal_cast().clear_without_destruction(); internal_cast().set(t, VariantNoClearTag {}); @@ -336,7 +336,7 @@ public: using Detail::MergeAndDeduplicatePacks>...>::MergeAndDeduplicatePacks; template> - void set(T&& t) requires(can_contain()) + void set(T&& t) requires(can_contain() && requires { StrippedT(forward(t)); }) { constexpr auto new_index = index_of(); Helper::delete_(m_index, m_data); @@ -345,7 +345,7 @@ public: } template> - void set(T&& t, Detail::VariantNoClearTag) requires(can_contain()) + void set(T&& t, Detail::VariantNoClearTag) requires(can_contain() && requires { StrippedT(forward(t)); }) { constexpr auto new_index = index_of(); new (m_data) StrippedT(forward(t));