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