brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · a4250e6 Raw
68 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++17, c++2010 11// constexpr ~expected();12//13// Effects: If has_value() is true, destroys val, otherwise destroys unex.14//15// Remarks: If is_trivially_destructible_v<T> is true, and is_trivially_destructible_v<E> is true,16// then this destructor is a trivial destructor.17 18#include <cassert>19#include <expected>20#include <type_traits>21#include <utility>22#include <memory>23 24#include "test_macros.h"25 26// Test Remarks: If is_trivially_destructible_v<T> is true, and is_trivially_destructible_v<E> is true,27// then this destructor is a trivial destructor.28struct NonTrivial {29  ~NonTrivial() {}30};31 32static_assert(std::is_trivially_destructible_v<std::expected<int, int>>);33static_assert(!std::is_trivially_destructible_v<std::expected<NonTrivial, int>>);34static_assert(!std::is_trivially_destructible_v<std::expected<int, NonTrivial>>);35static_assert(!std::is_trivially_destructible_v<std::expected<NonTrivial, NonTrivial>>);36 37struct TrackedDestroy {38  bool& destroyed;39  constexpr TrackedDestroy(bool& b) : destroyed(b) {}40  constexpr ~TrackedDestroy() { destroyed = true; }41};42 43constexpr bool test() {44  // has value45  {46    bool valueDestroyed = false;47    { [[maybe_unused]] std::expected<TrackedDestroy, TrackedDestroy> e(std::in_place, valueDestroyed); }48    assert(valueDestroyed);49  }50 51  // has error52  {53    bool errorDestroyed = false;54    { [[maybe_unused]] std::expected<TrackedDestroy, TrackedDestroy> e(std::unexpect, errorDestroyed); }55    assert(errorDestroyed);56  }57 58  return true;59}60 61int main(int, char**) {62  std::expected<std::unique_ptr<int>, int> a = std::make_unique<int>(42);63 64  test();65  static_assert(test());66  return 0;67}68