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