1acd629cdSMarshall Clow //===----------------------------------------------------------------------===//
2acd629cdSMarshall Clow //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6acd629cdSMarshall Clow //
7acd629cdSMarshall Clow //===----------------------------------------------------------------------===//
8acd629cdSMarshall Clow
9acd629cdSMarshall Clow // <queue>
1031cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14
11acd629cdSMarshall Clow
12acd629cdSMarshall Clow // template<class Compare, class Container>
13acd629cdSMarshall Clow // priority_queue(Compare, Container)
14acd629cdSMarshall Clow // -> priority_queue<typename Container::value_type, Container, Compare>;
15acd629cdSMarshall Clow //
16acd629cdSMarshall Clow // template<class InputIterator,
17acd629cdSMarshall Clow // class Compare = less<typename iterator_traits<InputIterator>::value_type>,
18acd629cdSMarshall Clow // class Container = vector<typename iterator_traits<InputIterator>::value_type>>
19acd629cdSMarshall Clow // priority_queue(InputIterator, InputIterator, Compare = Compare(), Container = Container())
20acd629cdSMarshall Clow // -> priority_queue<typename iterator_traits<InputIterator>::value_type, Container, Compare>;
21acd629cdSMarshall Clow //
22acd629cdSMarshall Clow // template<class Compare, class Container, class Allocator>
23acd629cdSMarshall Clow // priority_queue(Compare, Container, Allocator)
24acd629cdSMarshall Clow // -> priority_queue<typename Container::value_type, Container, Compare>;
25acd629cdSMarshall Clow
26acd629cdSMarshall Clow
27acd629cdSMarshall Clow #include <queue>
28acd629cdSMarshall Clow #include <vector>
29acd629cdSMarshall Clow #include <iterator>
30acd629cdSMarshall Clow #include <cassert>
31acd629cdSMarshall Clow #include <cstddef>
32acd629cdSMarshall Clow #include <climits> // INT_MAX
33acd629cdSMarshall Clow
34*68072a71SKonstantin Varlamov #include "deduction_guides_sfinae_checks.h"
35acd629cdSMarshall Clow #include "test_macros.h"
36acd629cdSMarshall Clow #include "test_iterators.h"
37acd629cdSMarshall Clow #include "test_allocator.h"
38acd629cdSMarshall Clow
39acd629cdSMarshall Clow struct A {};
40acd629cdSMarshall Clow
main(int,char **)412df59c50SJF Bastien int main(int, char**)
42acd629cdSMarshall Clow {
43acd629cdSMarshall Clow
44acd629cdSMarshall Clow // Test the explicit deduction guides
45acd629cdSMarshall Clow {
46acd629cdSMarshall Clow std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
47acd629cdSMarshall Clow std::priority_queue pri(std::greater<int>(), v); // priority_queue(Compare, Container)
48acd629cdSMarshall Clow
49acd629cdSMarshall Clow static_assert(std::is_same_v<decltype(pri), std::priority_queue<int, std::vector<int>, std::greater<int>>>, "");
50acd629cdSMarshall Clow assert(pri.size() == v.size());
51acd629cdSMarshall Clow assert(pri.top() == 0);
52acd629cdSMarshall Clow }
53acd629cdSMarshall Clow
54acd629cdSMarshall Clow {
55acd629cdSMarshall Clow std::vector<long, test_allocator<long>> v{10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
56acd629cdSMarshall Clow std::priority_queue pri(std::greater<long>(), v, test_allocator<long>(2)); // priority_queue(Compare, Container, Allocator)
57acd629cdSMarshall Clow
58acd629cdSMarshall Clow static_assert(std::is_same_v<decltype(pri),
59acd629cdSMarshall Clow std::priority_queue<long, std::vector<long, test_allocator<long>>, std::greater<long>>>, "");
60acd629cdSMarshall Clow assert(pri.size() == v.size());
61acd629cdSMarshall Clow assert(pri.top() == 10);
62acd629cdSMarshall Clow }
63acd629cdSMarshall Clow
64acd629cdSMarshall Clow {
65acd629cdSMarshall Clow std::vector<short> v{10, 11, 12, 13, 14, 15, 28, 17, 18, 19 };
66acd629cdSMarshall Clow std::priority_queue pri(v.begin(), v.end()); // priority_queue(Iter, Iter)
67acd629cdSMarshall Clow
68acd629cdSMarshall Clow static_assert(std::is_same_v<decltype(pri), std::priority_queue<short>>, "");
69acd629cdSMarshall Clow assert(pri.size() == v.size());
70acd629cdSMarshall Clow assert(pri.top() == 28);
71acd629cdSMarshall Clow }
72acd629cdSMarshall Clow
73acd629cdSMarshall Clow {
74acd629cdSMarshall Clow std::vector<double> v{10, 11, 12, 13, 6, 15, 28, 17, 18, 19 };
75acd629cdSMarshall Clow std::priority_queue pri(v.begin(), v.end(), std::greater<double>()); // priority_queue(Iter, Iter, Comp)
76acd629cdSMarshall Clow
77acd629cdSMarshall Clow static_assert(std::is_same_v<decltype(pri), std::priority_queue<double, std::vector<double>, std::greater<double>>>, "");
78acd629cdSMarshall Clow assert(pri.size() == v.size());
79acd629cdSMarshall Clow assert(pri.top() == 6);
80acd629cdSMarshall Clow }
81acd629cdSMarshall Clow
82acd629cdSMarshall Clow {
83acd629cdSMarshall Clow std::vector<double> v{10, 6, 15, 28, 4, 18, 19 };
84acd629cdSMarshall Clow std::deque<double> deq;
85acd629cdSMarshall Clow std::priority_queue pri(v.begin(), v.end(), std::greater<double>(), deq); // priority_queue(Iter, Iter, Comp, Container)
86acd629cdSMarshall Clow
87acd629cdSMarshall Clow static_assert(std::is_same_v<decltype(pri), std::priority_queue<double, std::deque<double>, std::greater<double>>>, "");
88acd629cdSMarshall Clow assert(pri.size() == v.size());
89acd629cdSMarshall Clow assert(pri.top() == 4);
90acd629cdSMarshall Clow }
91acd629cdSMarshall Clow
92acd629cdSMarshall Clow // Test the implicit deduction guides
93acd629cdSMarshall Clow {
94acd629cdSMarshall Clow // We don't expect this one to work - no way to implicitly get value_type
95acd629cdSMarshall Clow // std::priority_queue pri(std::allocator<int>()); // queue (allocator &)
96acd629cdSMarshall Clow }
97acd629cdSMarshall Clow
98acd629cdSMarshall Clow {
99acd629cdSMarshall Clow std::priority_queue<float> source;
100acd629cdSMarshall Clow std::priority_queue pri(source); // priority_queue(priority_queue &)
101acd629cdSMarshall Clow static_assert(std::is_same_v<decltype(pri)::value_type, float>, "");
102acd629cdSMarshall Clow static_assert(std::is_same_v<decltype(pri)::container_type, std::vector<float>>, "");
103acd629cdSMarshall Clow assert(pri.size() == 0);
104acd629cdSMarshall Clow }
105acd629cdSMarshall Clow
106acd629cdSMarshall Clow {
107dd15c272SArthur O'Dwyer typedef short T;
108acd629cdSMarshall Clow typedef std::greater<T> Comp;
109c479e0c9SLouis Dionne typedef test_allocator<T> Alloc;
110c479e0c9SLouis Dionne typedef std::deque<T, Alloc> Cont;
111dd15c272SArthur O'Dwyer typedef test_allocator<int> ConvertibleToAlloc;
112dd15c272SArthur O'Dwyer static_assert(std::uses_allocator_v<Cont, ConvertibleToAlloc> &&
113dd15c272SArthur O'Dwyer !std::is_same_v<typename Cont::allocator_type, ConvertibleToAlloc>);
114acd629cdSMarshall Clow
115dd15c272SArthur O'Dwyer {
116dd15c272SArthur O'Dwyer Comp comp;
117dd15c272SArthur O'Dwyer Cont cont;
118dd15c272SArthur O'Dwyer std::priority_queue pri(comp, cont, Alloc(2));
119dd15c272SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, Cont, Comp>>);
120dd15c272SArthur O'Dwyer }
121dd15c272SArthur O'Dwyer
122dd15c272SArthur O'Dwyer {
123dd15c272SArthur O'Dwyer Comp comp;
124dd15c272SArthur O'Dwyer Cont cont;
125dd15c272SArthur O'Dwyer std::priority_queue pri(comp, cont, ConvertibleToAlloc(2));
126dd15c272SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, Cont, Comp>>);
127dd15c272SArthur O'Dwyer }
128dd15c272SArthur O'Dwyer
129dd15c272SArthur O'Dwyer {
130dd15c272SArthur O'Dwyer Comp comp;
131dd15c272SArthur O'Dwyer Cont cont;
132dd15c272SArthur O'Dwyer std::priority_queue pri(comp, std::move(cont), Alloc(2));
133dd15c272SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, Cont, Comp>>);
134dd15c272SArthur O'Dwyer }
135dd15c272SArthur O'Dwyer
136dd15c272SArthur O'Dwyer {
137dd15c272SArthur O'Dwyer Comp comp;
138dd15c272SArthur O'Dwyer Cont cont;
139dd15c272SArthur O'Dwyer std::priority_queue pri(comp, std::move(cont), ConvertibleToAlloc(2));
140dd15c272SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, Cont, Comp>>);
141dd15c272SArthur O'Dwyer }
142dd15c272SArthur O'Dwyer }
143dd15c272SArthur O'Dwyer
144dd15c272SArthur O'Dwyer {
145dd15c272SArthur O'Dwyer typedef short T;
1463894a8a4SArthur O'Dwyer typedef signed char ConvertibleToT;
147dd15c272SArthur O'Dwyer typedef std::greater<T> Comp;
148dd15c272SArthur O'Dwyer typedef test_allocator<T> Alloc;
149dd15c272SArthur O'Dwyer typedef std::deque<T, Alloc> Cont;
150dd15c272SArthur O'Dwyer typedef test_allocator<int> ConvertibleToAlloc;
151dd15c272SArthur O'Dwyer static_assert(std::uses_allocator_v<Cont, ConvertibleToAlloc> &&
152dd15c272SArthur O'Dwyer !std::is_same_v<typename Cont::allocator_type, ConvertibleToAlloc>);
153dd15c272SArthur O'Dwyer
154dd15c272SArthur O'Dwyer {
155dd15c272SArthur O'Dwyer std::priority_queue<T, Cont, Comp> source;
156dd15c272SArthur O'Dwyer std::priority_queue pri(source, Alloc(2));
157dd15c272SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, Cont, Comp>>);
158dd15c272SArthur O'Dwyer }
159dd15c272SArthur O'Dwyer
160dd15c272SArthur O'Dwyer {
161dd15c272SArthur O'Dwyer std::priority_queue<T, Cont, Comp> source;
162dd15c272SArthur O'Dwyer std::priority_queue pri(source, ConvertibleToAlloc(2));
163dd15c272SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, Cont, Comp>>);
164dd15c272SArthur O'Dwyer }
165dd15c272SArthur O'Dwyer
166dd15c272SArthur O'Dwyer {
167dd15c272SArthur O'Dwyer std::priority_queue<T, Cont, Comp> source;
168dd15c272SArthur O'Dwyer std::priority_queue pri(std::move(source), Alloc(2));
169dd15c272SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, Cont, Comp>>);
170dd15c272SArthur O'Dwyer }
171dd15c272SArthur O'Dwyer
172dd15c272SArthur O'Dwyer {
173dd15c272SArthur O'Dwyer std::priority_queue<T, Cont, Comp> source;
174dd15c272SArthur O'Dwyer std::priority_queue pri(std::move(source), ConvertibleToAlloc(2));
175dd15c272SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, Cont, Comp>>);
176dd15c272SArthur O'Dwyer }
1773894a8a4SArthur O'Dwyer
1783894a8a4SArthur O'Dwyer {
1793894a8a4SArthur O'Dwyer Cont cont;
1803894a8a4SArthur O'Dwyer std::priority_queue pri(Comp(), cont, Alloc(2));
1813894a8a4SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, Cont, Comp>>);
1823894a8a4SArthur O'Dwyer }
1833894a8a4SArthur O'Dwyer
1843894a8a4SArthur O'Dwyer {
1853894a8a4SArthur O'Dwyer Cont cont;
1863894a8a4SArthur O'Dwyer std::priority_queue pri(Comp(), cont, ConvertibleToAlloc(2));
1873894a8a4SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, Cont, Comp>>);
1883894a8a4SArthur O'Dwyer }
1893894a8a4SArthur O'Dwyer
1903894a8a4SArthur O'Dwyer {
1913894a8a4SArthur O'Dwyer Cont cont;
1923894a8a4SArthur O'Dwyer std::priority_queue pri(Comp(), std::move(cont), Alloc(2));
1933894a8a4SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, Cont, Comp>>);
1943894a8a4SArthur O'Dwyer }
1953894a8a4SArthur O'Dwyer
1963894a8a4SArthur O'Dwyer {
1973894a8a4SArthur O'Dwyer Cont cont;
1983894a8a4SArthur O'Dwyer std::priority_queue pri(Comp(), std::move(cont), ConvertibleToAlloc(2));
1993894a8a4SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, Cont, Comp>>);
2003894a8a4SArthur O'Dwyer }
2013894a8a4SArthur O'Dwyer
2023894a8a4SArthur O'Dwyer {
2033894a8a4SArthur O'Dwyer T a[2] = {};
2043894a8a4SArthur O'Dwyer std::priority_queue pri(a, a+2, Alloc(2));
2053894a8a4SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, std::vector<T, Alloc>>>);
2063894a8a4SArthur O'Dwyer }
2073894a8a4SArthur O'Dwyer
2083894a8a4SArthur O'Dwyer {
2093894a8a4SArthur O'Dwyer T a[2] = {};
2103894a8a4SArthur O'Dwyer std::priority_queue pri(a, a+2, Comp(), Alloc(2));
2113894a8a4SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, std::vector<T, Alloc>, Comp>>);
2123894a8a4SArthur O'Dwyer }
2133894a8a4SArthur O'Dwyer
2143894a8a4SArthur O'Dwyer {
2153894a8a4SArthur O'Dwyer Cont cont;
2163894a8a4SArthur O'Dwyer ConvertibleToT a[2] = {};
2173894a8a4SArthur O'Dwyer std::priority_queue pri(a, a+2, Comp(), cont, Alloc(2));
2183894a8a4SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, Cont, Comp>>);
2193894a8a4SArthur O'Dwyer }
2203894a8a4SArthur O'Dwyer
2213894a8a4SArthur O'Dwyer {
2223894a8a4SArthur O'Dwyer Cont cont;
2233894a8a4SArthur O'Dwyer ConvertibleToT a[2] = {};
2243894a8a4SArthur O'Dwyer std::priority_queue pri(a, a+2, Comp(), cont, ConvertibleToAlloc(2));
2253894a8a4SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, Cont, Comp>>);
2263894a8a4SArthur O'Dwyer }
2273894a8a4SArthur O'Dwyer
2283894a8a4SArthur O'Dwyer {
2293894a8a4SArthur O'Dwyer Cont cont;
2303894a8a4SArthur O'Dwyer ConvertibleToT a[2] = {};
2313894a8a4SArthur O'Dwyer std::priority_queue pri(a, a+2, Comp(), std::move(cont), Alloc(2));
2323894a8a4SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, Cont, Comp>>);
2333894a8a4SArthur O'Dwyer }
2343894a8a4SArthur O'Dwyer
2353894a8a4SArthur O'Dwyer {
2363894a8a4SArthur O'Dwyer Cont cont;
2373894a8a4SArthur O'Dwyer ConvertibleToT a[2] = {};
2383894a8a4SArthur O'Dwyer std::priority_queue pri(a, a+2, Comp(), std::move(cont), ConvertibleToAlloc(2));
2393894a8a4SArthur O'Dwyer static_assert(std::is_same_v<decltype(pri), std::priority_queue<T, Cont, Comp>>);
2403894a8a4SArthur O'Dwyer }
241acd629cdSMarshall Clow }
2422df59c50SJF Bastien
243*68072a71SKonstantin Varlamov // Deduction guides should be SFINAE'd away when given:
244*68072a71SKonstantin Varlamov // - "bad" input iterators (that is, a type not qualifying as an input
245*68072a71SKonstantin Varlamov // iterator);
246*68072a71SKonstantin Varlamov // - a bad allocator;
247*68072a71SKonstantin Varlamov // - an allocator instead of a comparator;
248*68072a71SKonstantin Varlamov // - an allocator instead of a container;
249*68072a71SKonstantin Varlamov // - an allocator and a container that uses a different allocator.
250*68072a71SKonstantin Varlamov {
251*68072a71SKonstantin Varlamov using Comp = std::less<int>;
252*68072a71SKonstantin Varlamov using Cont = std::vector<int>;
253*68072a71SKonstantin Varlamov using Alloc = std::allocator<int>;
254*68072a71SKonstantin Varlamov using Iter = int*;
255*68072a71SKonstantin Varlamov
256*68072a71SKonstantin Varlamov // The only requirement in the Standard is that integral types cannot be
257*68072a71SKonstantin Varlamov // considered input iterators, beyond that it is unspecified.
258*68072a71SKonstantin Varlamov using BadIter = int;
259*68072a71SKonstantin Varlamov #ifdef _LIBCPP_VERSION
260*68072a71SKonstantin Varlamov struct OutputIter {
261*68072a71SKonstantin Varlamov using iterator_category = std::output_iterator_tag;
262*68072a71SKonstantin Varlamov using value_type = void;
263*68072a71SKonstantin Varlamov using difference_type = void;
264*68072a71SKonstantin Varlamov using pointer = void;
265*68072a71SKonstantin Varlamov using reference = void;
266*68072a71SKonstantin Varlamov
267*68072a71SKonstantin Varlamov const OutputIter& operator*() const { return *this; }
268*68072a71SKonstantin Varlamov const OutputIter& operator++() { return *this; }
269*68072a71SKonstantin Varlamov OutputIter operator++(int) const { return *this; }
270*68072a71SKonstantin Varlamov };
271*68072a71SKonstantin Varlamov #endif // _LIBCPP_VERSION
272*68072a71SKonstantin Varlamov
273*68072a71SKonstantin Varlamov struct BadAlloc {};
274*68072a71SKonstantin Varlamov using AllocAsComp = Alloc;
275*68072a71SKonstantin Varlamov using AllocAsCont = Alloc;
276*68072a71SKonstantin Varlamov using DiffAlloc = test_allocator<int>;
277*68072a71SKonstantin Varlamov
278*68072a71SKonstantin Varlamov // (iter, iter)
279*68072a71SKonstantin Varlamov //
280*68072a71SKonstantin Varlamov // Cannot deduce from (BAD_iter, BAD_iter)
281*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, BadIter, BadIter>);
282*68072a71SKonstantin Varlamov // Note: (OutputIter, OutputIter) is interpreted as (comp, cont) and fails on accessing
283*68072a71SKonstantin Varlamov // non-existent typedefs in `OutputIter` (as if it were a container). There is no
284*68072a71SKonstantin Varlamov // requirement to SFINAE away bad containers.
285*68072a71SKonstantin Varlamov
286*68072a71SKonstantin Varlamov // (iter, iter, comp)
287*68072a71SKonstantin Varlamov //
288*68072a71SKonstantin Varlamov // Cannot deduce from (BAD_iter, BAD_iter, comp)
289*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, BadIter, BadIter, Comp>);
290*68072a71SKonstantin Varlamov LIBCPP_STATIC_ASSERT(SFINAEs_away<std::priority_queue, OutputIter, OutputIter, Comp>);
291*68072a71SKonstantin Varlamov // Note: (iter, iter, ALLOC_as_comp) is allowed -- it just calls (iter, iter, alloc).
292*68072a71SKonstantin Varlamov
293*68072a71SKonstantin Varlamov // (iter, iter, comp, cont)
294*68072a71SKonstantin Varlamov //
295*68072a71SKonstantin Varlamov // Cannot deduce from (BAD_iter, BAD_iter, comp, cont)
296*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, BadIter, BadIter, Comp, Cont>);
297*68072a71SKonstantin Varlamov LIBCPP_STATIC_ASSERT(SFINAEs_away<std::priority_queue, OutputIter, OutputIter, Comp, Cont>);
298*68072a71SKonstantin Varlamov // Cannot deduce from (iter, iter, ALLOC_as_comp, cont)
299*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, Iter, Iter, AllocAsComp, Cont>);
300*68072a71SKonstantin Varlamov // Note: (iter, iter, comp, ALLOC_as_cont) is allowed -- it just calls (iter, iter, comp,
301*68072a71SKonstantin Varlamov // alloc).
302*68072a71SKonstantin Varlamov
303*68072a71SKonstantin Varlamov // (iter, iter, alloc)
304*68072a71SKonstantin Varlamov //
305*68072a71SKonstantin Varlamov // Cannot deduce from (BAD_iter, BAD_iter, alloc)
306*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, BadIter, BadIter, Alloc>);
307*68072a71SKonstantin Varlamov LIBCPP_STATIC_ASSERT(SFINAEs_away<std::priority_queue, OutputIter, OutputIter, Alloc>);
308*68072a71SKonstantin Varlamov // Note: (iter, iter, BAD_alloc) is interpreted as (iter, iter, comp) instead and fails upon
309*68072a71SKonstantin Varlamov // instantiation. There is no requirement to SFINAE away bad comparators.
310*68072a71SKonstantin Varlamov
311*68072a71SKonstantin Varlamov // (iter, iter, comp, alloc)
312*68072a71SKonstantin Varlamov //
313*68072a71SKonstantin Varlamov // Cannot deduce from (iter, iter, ALLOC_as_comp, alloc)
314*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, Iter, Iter, AllocAsComp, Alloc>);
315*68072a71SKonstantin Varlamov // Note: (iter, iter, comp, BAD_alloc) is interpreted as (iter, iter, comp, cont) instead
316*68072a71SKonstantin Varlamov // and fails upon instantiation. There is no requirement to SFINAE away bad containers.
317*68072a71SKonstantin Varlamov
318*68072a71SKonstantin Varlamov // (iter, iter, comp, cont, alloc)
319*68072a71SKonstantin Varlamov //
320*68072a71SKonstantin Varlamov // Cannot deduce from (BAD_iter, BAD_iter, comp, cont, alloc)
321*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, BadIter, BadIter, Comp, Cont, Alloc>);
322*68072a71SKonstantin Varlamov LIBCPP_STATIC_ASSERT(
323*68072a71SKonstantin Varlamov SFINAEs_away<std::priority_queue, OutputIter, OutputIter, Comp, Cont, Alloc>);
324*68072a71SKonstantin Varlamov // Cannot deduce from (iter, iter, ALLOC_as_comp, cont, alloc)
325*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, Iter, Iter, AllocAsComp, Cont, Alloc>);
326*68072a71SKonstantin Varlamov // Cannot deduce from (iter, iter, comp, ALLOC_as_cont, alloc)
327*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, Iter, Iter, Comp, AllocAsCont, Alloc>);
328*68072a71SKonstantin Varlamov // Cannot deduce from (iter, iter, comp, cont, BAD_alloc)
329*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, Iter, Iter, Comp, Cont, BadAlloc>);
330*68072a71SKonstantin Varlamov // Cannot deduce from (iter, iter, comp, cont, DIFFERENT_alloc)
331*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, Iter, Iter, Comp, Cont, DiffAlloc>);
332*68072a71SKonstantin Varlamov
333*68072a71SKonstantin Varlamov // (comp, alloc)
334*68072a71SKonstantin Varlamov //
335*68072a71SKonstantin Varlamov // Cannot deduce from (ALLOC_as_comp, alloc)
336*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, AllocAsComp, Alloc>);
337*68072a71SKonstantin Varlamov // Cannot deduce from (comp, BAD_alloc)
338*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, Comp, BadAlloc>);
339*68072a71SKonstantin Varlamov
340*68072a71SKonstantin Varlamov // (comp, cont, alloc)
341*68072a71SKonstantin Varlamov //
342*68072a71SKonstantin Varlamov // Cannot deduce from (ALLOC_as_comp, cont, alloc)
343*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, AllocAsComp, Cont, Alloc>);
344*68072a71SKonstantin Varlamov // Cannot deduce from (comp, ALLOC_as_cont, alloc)
345*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, Comp, AllocAsCont, Alloc>);
346*68072a71SKonstantin Varlamov // Cannot deduce from (comp, cont, BAD_alloc)
347*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, Comp, Cont, BadAlloc>);
348*68072a71SKonstantin Varlamov // Cannot deduce from (comp, cont, DIFFERENT_alloc)
349*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, Comp, Cont, DiffAlloc>);
350*68072a71SKonstantin Varlamov
351*68072a71SKonstantin Varlamov // (comp, cont)
352*68072a71SKonstantin Varlamov //
353*68072a71SKonstantin Varlamov // Cannot deduce from (ALLOC_as_comp, cont)
354*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, AllocAsComp, Cont>);
355*68072a71SKonstantin Varlamov // Cannot deduce from (comp, ALLOC_as_cont)
356*68072a71SKonstantin Varlamov static_assert(SFINAEs_away<std::priority_queue, Comp, AllocAsCont>);
357*68072a71SKonstantin Varlamov }
358*68072a71SKonstantin Varlamov
3592df59c50SJF Bastien return 0;
360acd629cdSMarshall Clow }
361