// Copyright (C) 2019-2023 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING3. If not see // . // { dg-do compile { target c++17 } } #include #include #include #include #include template struct require_same; template struct require_same { using type = void; }; template typename require_same::type check_type(U&) { } void test01() { std::priority_queue s0; std::priority_queue s1 = s0; check_type>(s1); std::priority_queue s2 = std::move(s0); check_type>(s2); const std::priority_queue s3 = s0; check_type>(s3); const std::priority_queue s4 = s3; check_type>(s4); std::allocator a; std::priority_queue s5(s0, a); check_type>(s5); std::priority_queue s6(std::move(s0), a); check_type>(s6); const std::priority_queue s7(s3, a); check_type>(s7); } template using input_iterator_seq = __gnu_test::test_container; void test02() { using Deque = std::deque; Deque d; using Vector = std::vector; Vector v; using Cmp = std::greater; Cmp cmp; std::priority_queue s1(cmp, d); check_type>(s1); std::priority_queue s2(cmp, d, d.get_allocator()); check_type>(s2); std::priority_queue s3(cmp, std::move(d)); check_type>(s3); std::priority_queue s4(cmp, std::move(d), d.get_allocator()); check_type>(s4); std::priority_queue s5(cmp, v); check_type>(s5); std::priority_queue s6(cmp, v, v.get_allocator()); check_type>(s6); std::priority_queue s7(cmp, std::move(v)); check_type>(s7); std::priority_queue s8(cmp, std::move(v), v.get_allocator()); check_type>(s8); short a[1] = {}; input_iterator_seq seq(a); std::priority_queue s9(seq.begin(), seq.end()); check_type>(s9); std::priority_queue s10(seq.begin(), seq.end(), {}); check_type>(s10); std::priority_queue s11(seq.begin(), seq.end(), {}, {}); check_type>(s11); std::priority_queue s12(seq.begin(), seq.end(), cmp); check_type>(s12); std::priority_queue s13(seq.begin(), seq.end(), cmp, {}); check_type>(s13); std::priority_queue s14(seq.begin(), seq.end(), cmp, std::deque{}); check_type, Cmp>>(s14); } struct Pool; template struct Alloc : __gnu_test::SimpleAllocator { Alloc(Pool*) { } template Alloc(const Alloc&) { } }; void test_p1518r2() { // P1518R2 - Stop overconstraining allocators in container deduction guides. // This is a C++23 feature but we support it for C++17 too. using Vector = std::vector>; using Cmp = std::greater; Pool* p = nullptr; Vector v(p); Cmp cmp; std::priority_queue q1(cmp, v, p); check_type>(q1); std::priority_queue q2(cmp, std::move(v), p); check_type>(q2); std::priority_queue q3(q1, p); check_type>(q3); std::priority_queue q4(std::move(q1), p); check_type>(q4); }