// { 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