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 | // <set> |
12 | |
13 | // template<class InputIterator, |
14 | // class Compare = less<iter-value-type<InputIterator>>, |
15 | // class Allocator = allocator<iter-value-type<InputIterator>>> |
16 | // set(InputIterator, InputIterator, |
17 | // Compare = Compare(), Allocator = Allocator()) |
18 | // -> set<iter-value-type<InputIterator>, Compare, Allocator>; |
19 | // template<class Key, class Compare = less<Key>, |
20 | // class Allocator = allocator<Key>> |
21 | // set(initializer_list<Key>, Compare = Compare(), Allocator = Allocator()) |
22 | // -> set<Key, Compare, Allocator>; |
23 | // template<class InputIterator, class Allocator> |
24 | // set(InputIterator, InputIterator, Allocator) |
25 | // -> set<iter-value-type<InputIterator>, |
26 | // less<iter-value-type<InputIterator>>, Allocator>; |
27 | // template<class Key, class Allocator> |
28 | // set(initializer_list<Key>, Allocator) |
29 | // -> set<Key, less<Key>, Allocator>; |
30 | |
31 | #include <functional> |
32 | #include <set> |
33 | #include <type_traits> |
34 | |
35 | struct NotAnAllocator { |
36 | friend bool operator<(NotAnAllocator, NotAnAllocator) { return false; } |
37 | }; |
38 | |
39 | int main(int, char **) { |
40 | { |
41 | // cannot deduce Key from nothing |
42 | std::set s; |
43 | // expected-error@-1{{no viable constructor or deduction guide for deduction of template arguments of 'set'}} |
44 | } |
45 | { |
46 | // cannot deduce Key from just (Compare) |
47 | std::set s(std::less<int>{}); |
48 | // expected-error@-1{{no viable constructor or deduction guide for deduction of template arguments of 'set'}} |
49 | } |
50 | { |
51 | // cannot deduce Key from just (Compare, Allocator) |
52 | std::set s(std::less<int>{}, std::allocator<int>{}); |
53 | // expected-error@-1{{no viable constructor or deduction guide for deduction of template arguments of 'set'}} |
54 | } |
55 | { |
56 | // cannot deduce Key from just (Allocator) |
57 | std::set s(std::allocator<int>{}); |
58 | // expected-error@-1{{no viable constructor or deduction guide for deduction of template arguments of 'set'}} |
59 | } |
60 | { |
61 | // since we have parens, not braces, this deliberately does not find the |
62 | // initializer_list constructor |
63 | NotAnAllocator a; |
64 | std::set s(a); |
65 | // expected-error@-1{{no viable constructor or deduction guide for deduction of template arguments of 'set'}} |
66 | } |
67 | |
68 | return 0; |
69 | } |
70 | |