xref: /llvm-project/libcxx/test/std/containers/associative/multimap/multimap.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 // <map>
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 // multimap(InputIterator, InputIterator,
17b82dcb62SLouis Dionne //          Compare = Compare(), Allocator = Allocator())
18b82dcb62SLouis Dionne //   -> multimap<iter-value-type<InputIterator>, Compare, Allocator>;
19b82dcb62SLouis Dionne // template<class Key, class Compare = less<Key>, class Allocator = allocator<Key>>
20b82dcb62SLouis Dionne // multimap(initializer_list<Key>, Compare = Compare(), Allocator = Allocator())
21b82dcb62SLouis Dionne //   -> multimap<Key, Compare, Allocator>;
22b82dcb62SLouis Dionne // template<class InputIterator, class Allocator>
23b82dcb62SLouis Dionne // multimap(InputIterator, InputIterator, Allocator)
24b82dcb62SLouis Dionne //   -> multimap<iter-value-type<InputIterator>, less<iter-value-type<InputIterator>>, Allocator>;
25b82dcb62SLouis Dionne // template<class Key, class Allocator>
26b82dcb62SLouis Dionne // multimap(initializer_list<Key>, Allocator)
27b82dcb62SLouis Dionne //   -> multimap<Key, less<Key>, Allocator>;
28b82dcb62SLouis Dionne 
29b82dcb62SLouis Dionne #include <climits> // INT_MAX
30b82dcb62SLouis Dionne #include <functional>
31b82dcb62SLouis Dionne #include <map>
32b82dcb62SLouis Dionne #include <type_traits>
33b82dcb62SLouis Dionne 
34b82dcb62SLouis Dionne struct NotAnAllocator {
operator <(NotAnAllocator,NotAnAllocator)35b82dcb62SLouis Dionne     friend bool operator<(NotAnAllocator, NotAnAllocator) { return false; }
36b82dcb62SLouis Dionne };
37b82dcb62SLouis Dionne 
38b82dcb62SLouis Dionne using P = std::pair<int, long>;
39b82dcb62SLouis Dionne using PC = std::pair<const int, long>;
40b82dcb62SLouis Dionne 
main(int,char **)41b82dcb62SLouis Dionne int main(int, char**)
42b82dcb62SLouis Dionne {
43b82dcb62SLouis Dionne     {
44b82dcb62SLouis Dionne         // cannot deduce Key and T from nothing
45*9c4a716cSMatheus Izvekov         std::multimap m; // expected-error-re{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}multimap'}}
46b82dcb62SLouis Dionne     }
47b82dcb62SLouis Dionne     {
48b82dcb62SLouis Dionne         // cannot deduce Key and T from just (Compare)
49b82dcb62SLouis Dionne         std::multimap m(std::less<int>{});
50*9c4a716cSMatheus Izvekov             // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}multimap'}}
51b82dcb62SLouis Dionne     }
52b82dcb62SLouis Dionne     {
53b82dcb62SLouis Dionne         // cannot deduce Key and T from just (Compare, Allocator)
54b82dcb62SLouis Dionne         std::multimap m(std::less<int>{}, std::allocator<PC>{});
55*9c4a716cSMatheus Izvekov             // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}multimap'}}
56b82dcb62SLouis Dionne     }
57b82dcb62SLouis Dionne     {
58b82dcb62SLouis Dionne         // cannot deduce Key and T from just (Allocator)
59b82dcb62SLouis Dionne         std::multimap m(std::allocator<PC>{});
60*9c4a716cSMatheus Izvekov             // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}multimap'}}
61b82dcb62SLouis Dionne     }
62b82dcb62SLouis Dionne     {
63b82dcb62SLouis Dionne         // refuse to rebind the allocator if Allocator::value_type is not exactly what we expect
64b82dcb62SLouis Dionne         const P arr[] = { {1,1L}, {2,2L}, {3,3L} };
65b82dcb62SLouis Dionne         std::multimap m(arr, arr + 3, std::allocator<P>());
669bb9ec38SLouis Dionne             // expected-error-re@map:* {{static assertion failed{{( due to requirement '.*')?}}{{.*}}Allocator::value_type must be same type as value_type}}
67b82dcb62SLouis Dionne     }
68b82dcb62SLouis Dionne     {
69b82dcb62SLouis Dionne         // cannot convert from some arbitrary unrelated type
70b82dcb62SLouis Dionne         NotAnAllocator a;
71*9c4a716cSMatheus Izvekov         std::multimap m(a); // expected-error-re{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}multimap'}}
72b82dcb62SLouis Dionne     }
73b82dcb62SLouis Dionne     {
74b82dcb62SLouis Dionne         // cannot deduce that the inner braced things should be std::pair and not something else
75b82dcb62SLouis Dionne         std::multimap m{ {1,1L}, {2,2L}, {3,3L} };
76*9c4a716cSMatheus Izvekov             // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}multimap'}}
77b82dcb62SLouis Dionne     }
78b82dcb62SLouis Dionne     {
79b82dcb62SLouis Dionne         // cannot deduce that the inner braced things should be std::pair and not something else
80b82dcb62SLouis Dionne         std::multimap m({ {1,1L}, {2,2L}, {3,3L} }, std::less<int>());
81*9c4a716cSMatheus Izvekov             // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}multimap'}}
82b82dcb62SLouis Dionne     }
83b82dcb62SLouis Dionne     {
84b82dcb62SLouis Dionne         // cannot deduce that the inner braced things should be std::pair and not something else
85b82dcb62SLouis Dionne         std::multimap m({ {1,1L}, {2,2L}, {3,3L} }, std::less<int>(), std::allocator<PC>());
86*9c4a716cSMatheus Izvekov             // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}multimap'}}
87b82dcb62SLouis Dionne     }
88b82dcb62SLouis Dionne     {
89b82dcb62SLouis Dionne         // cannot deduce that the inner braced things should be std::pair and not something else
90b82dcb62SLouis Dionne         std::multimap m({ {1,1L}, {2,2L}, {3,3L} }, std::allocator<PC>());
91*9c4a716cSMatheus Izvekov             // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}multimap'}}
92b82dcb62SLouis Dionne     }
93b82dcb62SLouis Dionne     {
94b82dcb62SLouis Dionne         // since we have parens, not braces, this deliberately does not find the initializer_list constructor
95b82dcb62SLouis Dionne         std::multimap m(P{1,1L});
96*9c4a716cSMatheus Izvekov             // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}multimap'}}
97b82dcb62SLouis Dionne     }
98b82dcb62SLouis Dionne     {
99b82dcb62SLouis Dionne         // since we have parens, not braces, this deliberately does not find the initializer_list constructor
100b82dcb62SLouis Dionne         std::multimap m(PC{1,1L});
101*9c4a716cSMatheus Izvekov             // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}multimap'}}
102b82dcb62SLouis Dionne     }
103b82dcb62SLouis Dionne 
104b82dcb62SLouis Dionne     return 0;
105b82dcb62SLouis Dionne }
106