view gcc/testsuite/g++.dg/cpp2a/cond-triv1.C @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
line wrap: on
line source

// Testcase from P0848R0
// { dg-do compile { target concepts } }

#include <type_traits>

template <typename T>
class optional
{
  struct empty {};
  union {
    empty _ = { };
    T value;
  };
  bool engaged = false;

public:
  constexpr optional() = default;

  constexpr optional(optional const&)
    requires std::is_trivially_copy_constructible_v<T>
    = default;
  constexpr optional(optional const& o)
    : engaged (o.engaged)
  {
    if (engaged)
      new (&value) T (o.value);
  }

  ~optional()
    requires std::is_trivially_destructible_v<T>
    = default;
  ~optional()
  {
    if (engaged)
      value.~T();
  }

  // ...
};

struct A { A(); A(const A&); ~A(); };

static_assert(std::is_trivially_copy_constructible_v<optional<int>>);
static_assert(!std::is_trivially_copy_constructible_v<optional<A>>);
static_assert(std::is_trivially_destructible_v<optional<int>>);
static_assert(!std::is_trivially_destructible_v<optional<A>>);