(root)/
gcc-13.2.0/
libstdc++-v3/
testsuite/
23_containers/
priority_queue/
lwg3506.cc
// { dg-do run { target c++11 } }

#include <queue>
#include <testsuite_hooks.h>
#include <testsuite_allocator.h>

void
test_lwg3506()
{
  // LWG 3506 Missing allocator-extended constructors for priority_queue

  using Alloc = __gnu_test::uneq_allocator<int>;

  using Container = std::vector<int, Alloc>;

  struct Queue : std::priority_queue<int, Container>
  {
    using priority_queue::priority_queue;

    Alloc get_allocator() const { return c.get_allocator(); }
  };

  using Compare = Queue::value_compare;

  const Alloc a1(1), a2(2), a3(3), a4(4);
  const int vals[] = { 5, 3, 9, 1, 7 };
  Container cont({ 20, 30, 40 }, Alloc(99));

  Queue q1(vals, vals+5, a1);
  VERIFY( q1.get_allocator() == a1 );
  VERIFY( q1.size() == 5 );
  VERIFY( q1.top() == 9 );

  Queue q2(vals, vals+5, Compare(), a2);
  VERIFY( q2.get_allocator() == a2 );
  VERIFY( q2.size() == 5 );
  VERIFY( q2.top() == 9 );

  Queue q3(vals, vals+5, Compare(), cont, a3);
  VERIFY( q3.get_allocator() == a3 );
  VERIFY( q3.size() == 8 );
  VERIFY( q3.top() == 40 );

  Queue q4(vals, vals+5, Compare(), std::move(cont), a4);
  VERIFY( q4.get_allocator() == a4 );
  VERIFY( q4.size() == 8 );
  VERIFY( q4.top() == 40 );
  VERIFY( cont.empty() );
}

int main()
{
  test_lwg3506();
}