(root)/
gcc-13.2.0/
libstdc++-v3/
testsuite/
23_containers/
list/
modifiers/
emplace/
1.cc
// { dg-do run { target c++11 } }

#include <list>
#include <testsuite_hooks.h>

void
test01()
{
  std::list<int> c;
  std::list<int>::iterator pos;

  // libstdc++/52799
  pos = c.emplace(c.begin());
  VERIFY( c.size() == 1 );
  VERIFY( *pos == 0 );
  VERIFY( pos == c.begin() );
  pos = c.emplace(c.begin(), 2);
  VERIFY( c.size() == 2 );
  VERIFY( *pos == 2 );
  VERIFY( pos == c.begin() );
  VERIFY( *++pos == 0 );
  pos = c.emplace(c.end(), 3);
  VERIFY( c.size() == 3 );
  VERIFY( *pos == 3 );
  VERIFY( pos == --c.end() );
  VERIFY( *--pos == 0 );
  VERIFY( *--pos == 2 );

  // const_iterator
  pos = c.emplace(c.cbegin());
  VERIFY( c.size() == 4 );
  VERIFY( *pos == 0 );
  VERIFY( pos == c.cbegin() );
  VERIFY( *++pos == 2 );
  std::list<int>::const_iterator i = std::next(c.cbegin(), 2);
  pos = c.emplace(i, 22);
  VERIFY( c.size() == 5 );
  VERIFY( *pos == 22 );
  VERIFY( pos == std::prev(i) );
  VERIFY( *--pos == 2 );
  VERIFY( *--pos == 0 );
}

struct V
{
  explicit V(int a, int b = 0) : val(a+b) { }
  int val;
};

void
test02()
{
  std::list<V> c;
  std::list<V>::iterator pos;

  pos = c.emplace(c.end(), 1);
  VERIFY( c.size() == 1 );
  VERIFY( pos->val == 1 );
  VERIFY( pos == --c.end() );
  pos = c.emplace(c.cend(), 2, 3);
  VERIFY( c.size() == 2 );
  VERIFY( pos->val == 5 );
  VERIFY( pos == --c.cend() );
  VERIFY( c.front().val == 1 );
}

int main()
{
  test01();
  test02();
}