mirror of
https://github.com/intel/llvm.git
synced 2026-01-17 06:40:01 +08:00
[libc++] Remove unnecessary static assertion in allocate_shared
Checking that `T` is constructible from `Args...` is technically not required by the Standard, although any implementation will obviously error out if that's not satisfied. However, this check is incompatible with using Allocator construction in the control block (upcoming change as part of implementing P0674), so I'm removing it now to reduce the upcoming diff as much as possible. Differential Revision: https://reviews.llvm.org/D93246
This commit is contained in:
@@ -3307,8 +3307,6 @@ template<class _Tp, class _Alloc, class ..._Args, class = _EnableIf<!is_array<_T
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
shared_ptr<_Tp> allocate_shared(const _Alloc& __a, _Args&& ...__args)
|
||||
{
|
||||
static_assert(is_constructible<_Tp, _Args...>::value,
|
||||
"allocate_shared/make_shared: the type is not constructible from the provided arguments");
|
||||
using _ControlBlock = __shared_ptr_emplace<_Tp, _Alloc>;
|
||||
using _ControlBlockAllocator = typename __allocator_traits_rebind<_Alloc, _ControlBlock>::type;
|
||||
__allocation_guard<_ControlBlockAllocator> __guard(__a, 1);
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// GCC 5 does not evaluate static assertions dependent on a template parameter.
|
||||
// UNSUPPORTED: gcc-5
|
||||
|
||||
// <memory>
|
||||
|
||||
// shared_ptr
|
||||
|
||||
// template<class T, class A, class... Args>
|
||||
// shared_ptr<T> allocate_shared(const A& a, Args&&... args);
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "test_macros.h"
|
||||
|
||||
struct S {
|
||||
protected:
|
||||
S () {}; // ctor is protected
|
||||
};
|
||||
|
||||
int main(int, char**) {
|
||||
typedef std::allocator<S> A;
|
||||
A a;
|
||||
std::shared_ptr<S> p = std::allocate_shared<S, A>(a); // expected-error@memory:* {{static_assert failed due to requirement 'is_constructible<S>::value}}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// GCC 5 does not evaluate static assertions dependent on a template parameter.
|
||||
// UNSUPPORTED: gcc-5
|
||||
|
||||
// <memory>
|
||||
|
||||
// shared_ptr
|
||||
|
||||
// template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args);
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "test_macros.h"
|
||||
|
||||
struct S {
|
||||
protected:
|
||||
S () {}; // ctor is protected
|
||||
};
|
||||
|
||||
int main(int, char**) {
|
||||
std::shared_ptr<S> p = std::make_shared<S>(); // expected-error@memory:* {{static_assert failed due to requirement 'is_constructible<S>::value}}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user