xref: /llvm-project/libcxx/test/std/containers/associative/set/set.cons/deduct.verify.cpp (revision 9c4a716c1292096fcbdf415b63b7b0122b03310f)
1b82dcb62SLouis Dionne //===----------------------------------------------------------------------===//
2b82dcb62SLouis Dionne //
3b82dcb62SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4b82dcb62SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5b82dcb62SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b82dcb62SLouis Dionne //
7b82dcb62SLouis Dionne //===----------------------------------------------------------------------===//
8b82dcb62SLouis Dionne 
9b82dcb62SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14
10b82dcb62SLouis Dionne 
11b82dcb62SLouis Dionne // <set>
12b82dcb62SLouis Dionne 
13b82dcb62SLouis Dionne // template<class InputIterator,
14b82dcb62SLouis Dionne //          class Compare = less<iter-value-type<InputIterator>>,
15b82dcb62SLouis Dionne //          class Allocator = allocator<iter-value-type<InputIterator>>>
16b82dcb62SLouis Dionne // set(InputIterator, InputIterator,
17b82dcb62SLouis Dionne //     Compare = Compare(), Allocator = Allocator())
18b82dcb62SLouis Dionne //   -> set<iter-value-type<InputIterator>, Compare, Allocator>;
19b82dcb62SLouis Dionne // template<class Key, class Compare = less<Key>,
20b82dcb62SLouis Dionne //          class Allocator = allocator<Key>>
21b82dcb62SLouis Dionne // set(initializer_list<Key>, Compare = Compare(), Allocator = Allocator())
22b82dcb62SLouis Dionne //   -> set<Key, Compare, Allocator>;
23b82dcb62SLouis Dionne // template<class InputIterator, class Allocator>
24b82dcb62SLouis Dionne // set(InputIterator, InputIterator, Allocator)
25b82dcb62SLouis Dionne //   -> set<iter-value-type<InputIterator>,
26b82dcb62SLouis Dionne //          less<iter-value-type<InputIterator>>, Allocator>;
27b82dcb62SLouis Dionne // template<class Key, class Allocator>
28b82dcb62SLouis Dionne // set(initializer_list<Key>, Allocator)
29b82dcb62SLouis Dionne //   -> set<Key, less<Key>, Allocator>;
30b82dcb62SLouis Dionne 
31b82dcb62SLouis Dionne #include <functional>
32b82dcb62SLouis Dionne #include <set>
33b82dcb62SLouis Dionne #include <type_traits>
34b82dcb62SLouis Dionne 
35b82dcb62SLouis Dionne struct NotAnAllocator {
operator <(NotAnAllocator,NotAnAllocator)36b82dcb62SLouis Dionne   friend bool operator<(NotAnAllocator, NotAnAllocator) { return false; }
37b82dcb62SLouis Dionne };
38b82dcb62SLouis Dionne 
main(int,char **)39b82dcb62SLouis Dionne int main(int, char **) {
40b82dcb62SLouis Dionne   {
41b82dcb62SLouis Dionne     // cannot deduce Key from nothing
42b82dcb62SLouis Dionne     std::set s;
43*9c4a716cSMatheus Izvekov     // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}set'}}
44b82dcb62SLouis Dionne   }
45b82dcb62SLouis Dionne   {
46b82dcb62SLouis Dionne     // cannot deduce Key from just (Compare)
47b82dcb62SLouis Dionne     std::set s(std::less<int>{});
48*9c4a716cSMatheus Izvekov     // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}set'}}
49b82dcb62SLouis Dionne   }
50b82dcb62SLouis Dionne   {
51b82dcb62SLouis Dionne     // cannot deduce Key from just (Compare, Allocator)
52b82dcb62SLouis Dionne     std::set s(std::less<int>{}, std::allocator<int>{});
53*9c4a716cSMatheus Izvekov     // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}set'}}
54b82dcb62SLouis Dionne   }
55b82dcb62SLouis Dionne   {
56b82dcb62SLouis Dionne     // cannot deduce Key from just (Allocator)
57b82dcb62SLouis Dionne     std::set s(std::allocator<int>{});
58*9c4a716cSMatheus Izvekov     // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}set'}}
59b82dcb62SLouis Dionne   }
60b82dcb62SLouis Dionne   {
61b82dcb62SLouis Dionne     // since we have parens, not braces, this deliberately does not find the
62b82dcb62SLouis Dionne     // initializer_list constructor
63b82dcb62SLouis Dionne     NotAnAllocator a;
64b82dcb62SLouis Dionne     std::set s(a);
65*9c4a716cSMatheus Izvekov     // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}set'}}
66b82dcb62SLouis Dionne   }
67b82dcb62SLouis Dionne 
68b82dcb62SLouis Dionne   return 0;
69b82dcb62SLouis Dionne }
70