(root)/
gcc-13.2.0/
libstdc++-v3/
testsuite/
21_strings/
basic_string/
modifiers/
swap/
constexpr.cc
// { dg-options "-std=gnu++20" }
// { dg-do compile { target c++20 } }
// { dg-require-effective-target cxx11_abi }

#include <string>
#include <testsuite_hooks.h>

using C = char;
using T = std::char_traits<C>;

constexpr bool
test_swap()
{
  std::basic_string<C> s0;
  s0.swap(s0);
  VERIFY( s0.empty() );
  std::basic_string<C> s00;
  s0.swap(s00);
  VERIFY( s0.empty() );
  VERIFY( s00.empty() );

  std::basic_string<C> s1 = "s1";
  s1.swap(s0);
  VERIFY( s1.empty() );
  VERIFY( ! s0.empty() );
  s1.swap(s0);
  VERIFY( s0.empty() );
  VERIFY( ! s1.empty() );

  std::basic_string<C> s2 = "quite a long string, but not very long";
  s2.swap(s1);
  VERIFY( s2.length() == 2 );
  VERIFY( s1.length() == 38 );
  s2.swap(s1);
  VERIFY( s1.length() == 2 );
  VERIFY( s2.length() == 38 );

  swap(s2, s0);
  VERIFY( s2.empty() );
  VERIFY( s0.length() == 38 );

  auto s3 = s0;
  swap(s3, s0);
  VERIFY( s3 == s0 );

  return true;
}

static_assert( test_swap() );