1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 // UNSUPPORTED: c++03, c++11, c++14
10
11 // <memory>
12
13 // unique_ptr
14
15 // The following constructors should not be selected by class template argument
16 // deduction:
17 //
18 // constexpr explicit unique_ptr(pointer p) // constexpr since C++23
19 // constexpr unique_ptr(pointer p, const D& d) noexcept // constexpr since C++23
20 // constexpr unique_ptr(pointer p, remove_reference_t<D>&& d) noexcept // constexpr since C++23
21
22 #include <memory>
23
24 #include "deduction_guides_sfinae_checks.h"
25
26 struct Deleter {
operator ()Deleter27 void operator()(int* p) const { delete p; }
28 };
29
main(int,char **)30 int main(int, char**) {
31 // Cannot deduce from (ptr).
32 static_assert(SFINAEs_away<std::unique_ptr, int*>);
33 // Cannot deduce from (array).
34 static_assert(SFINAEs_away<std::unique_ptr, int[]>);
35 // Cannot deduce from (ptr, Deleter&&).
36 static_assert(SFINAEs_away<std::unique_ptr, int*, Deleter&&>);
37 // Cannot deduce from (array, Deleter&&).
38 static_assert(SFINAEs_away<std::unique_ptr, int[], Deleter&&>);
39 // Cannot deduce from (ptr, const Deleter&).
40 static_assert(SFINAEs_away<std::unique_ptr, int*, const Deleter&>);
41 // Cannot deduce from (array, const Deleter&).
42 static_assert(SFINAEs_away<std::unique_ptr, int[], const Deleter&>);
43
44 return 0;
45 }
46