diff --git a/AK/NonnullOwnPtr.h b/AK/NonnullOwnPtr.h index 58a3f3a7bfa..00cf91f1cb3 100644 --- a/AK/NonnullOwnPtr.h +++ b/AK/NonnullOwnPtr.h @@ -163,11 +163,18 @@ inline NonnullOwnPtr adopt_own(T& object) #endif template -inline NonnullOwnPtr make(Args&&... args) +requires(IsConstructible) inline NonnullOwnPtr make(Args&&... args) { return NonnullOwnPtr(NonnullOwnPtr::Adopt, *new T(forward(args)...)); } +// FIXME: Remove once P0960R3 is available in Clang. +template +inline NonnullOwnPtr make(Args&&... args) +{ + return NonnullOwnPtr(NonnullOwnPtr::Adopt, *new T { forward(args)... }); +} + template struct Traits> : public GenericTraits> { using PeekType = T*; diff --git a/AK/NonnullRefPtr.h b/AK/NonnullRefPtr.h index b65f044ae91..7eb4b1e628c 100644 --- a/AK/NonnullRefPtr.h +++ b/AK/NonnullRefPtr.h @@ -336,11 +336,17 @@ inline void swap(NonnullRefPtr& a, NonnullRefPtr& b) } template -inline NonnullRefPtr create(Args&&... args) +requires(IsConstructible) inline NonnullRefPtr create(Args&&... args) { return NonnullRefPtr(NonnullRefPtr::Adopt, *new T(forward(args)...)); } +// FIXME: Remove once P0960R3 is available in Clang. +template +inline NonnullRefPtr create(Args&&... args) +{ + return NonnullRefPtr(NonnullRefPtr::Adopt, *new T { forward(args)... }); +} } template diff --git a/AK/OwnPtr.h b/AK/OwnPtr.h index 0fba019ddf1..ee220a9aaa6 100644 --- a/AK/OwnPtr.h +++ b/AK/OwnPtr.h @@ -206,11 +206,19 @@ inline OwnPtr adopt_own_if_nonnull(T* object) } template -inline OwnPtr try_make(Args&&... args) +requires(IsConstructible) inline OwnPtr try_make(Args&&... args) { return adopt_own_if_nonnull(new (nothrow) T(forward(args)...)); } +// FIXME: Remove once P0960R3 is available in Clang. +template +inline OwnPtr try_make(Args&&... args) + +{ + return adopt_own_if_nonnull(new (nothrow) T { forward(args)... }); +} + template struct Traits> : public GenericTraits> { using PeekType = T*; diff --git a/AK/RefPtr.h b/AK/RefPtr.h index 7e8e6b573e9..1d194a38b36 100644 --- a/AK/RefPtr.h +++ b/AK/RefPtr.h @@ -486,11 +486,18 @@ inline RefPtr adopt_ref_if_nonnull(T* object) } template -inline RefPtr try_create(Args&&... args) +requires(IsConstructible) inline RefPtr try_create(Args&&... args) { return adopt_ref_if_nonnull(new (nothrow) T(forward(args)...)); } +// FIXME: Remove once P0960R3 is available in Clang. +template +inline RefPtr try_create(Args&&... args) +{ + return adopt_ref_if_nonnull(new (nothrow) T { forward(args)... }); +} + } using AK::adopt_ref_if_nonnull; diff --git a/AK/StdLibExtraDetails.h b/AK/StdLibExtraDetails.h index dca32e33d6c..e8f6dd6ab50 100644 --- a/AK/StdLibExtraDetails.h +++ b/AK/StdLibExtraDetails.h @@ -443,6 +443,10 @@ auto declval() -> T; template inline constexpr bool IsCallableWithArguments = requires(T t) { t(declval()...); }; + +template +inline constexpr bool IsConstructible = requires { ::new T(declval()...); }; + } using AK::Detail::AddConst; using AK::Detail::Conditional; @@ -459,6 +463,7 @@ using AK::Detail::IsBaseOf; using AK::Detail::IsCallableWithArguments; using AK::Detail::IsClass; using AK::Detail::IsConst; +using AK::Detail::IsConstructible; using AK::Detail::IsEnum; using AK::Detail::IsFloatingPoint; using AK::Detail::IsFunction;