(root)/
gcc-13.2.0/
libstdc++-v3/
testsuite/
20_util/
variant/
102912.cc
// { dg-do compile { target c++17 } }
#include <variant>

void
test01()
{
  struct X {
    ~X() { } // non-trivial
  };

  std::variant<const int, const X> v;
  auto vv = v;
}

#if __cpp_lib_variant >= 202106L // P2231R1 constexpr destruction in variant
constexpr bool
test02()
{
  struct Y {
    constexpr ~Y() { } // non-trivial
  };
  using V = std::variant<int, const int, const Y, Y>;

  V v1(std::in_place_index<1>, 1);
  V vv1 = v1;
  if (vv1.index() != v1.index())
    return false;

  V v2(std::in_place_index<2>);
  V vv2 = v2;
  if (vv2.index() != v2.index())
    return false;

  return true;
}
static_assert( test02() );

constexpr bool
test03()
{
  struct Y {
    constexpr ~Y() { } // non-trivial
  };
  using V = std::variant<int, int, Y, Y>;

  V v1(std::in_place_index<1>, 1);
  V vv1 = v1;
  if (vv1.index() != v1.index())
    return false;
  vv1 = v1;
  if (vv1.index() != v1.index())
    return false;
  vv1 = std::move(v1);
  if (vv1.index() != v1.index())
    return false;

  V v2(std::in_place_index<2>);
  V vv2 = v2;
  if (vv2.index() != v2.index())
    return false;
  vv2 = v2;
  if (vv2.index() != v2.index())
    return false;
  vv2 = std::move(v2);
  if (vv2.index() != v2.index())
    return false;

  return true;
}
static_assert( test03() );
#endif