brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.5 KiB · 798149f Raw
57 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 false, destroys unex.14//15// Remarks: If is_trivially_destructible_v<E> is true, then this destructor is a trivial destructor.16 17#include <cassert>18#include <expected>19#include <type_traits>20#include <utility>21 22#include "test_macros.h"23 24// Test Remarks: If is_trivially_destructible_v<E> is true, then this destructor is a trivial destructor.25struct NonTrivial {26  ~NonTrivial() {}27};28 29static_assert(std::is_trivially_destructible_v<std::expected<void, int>>);30static_assert(!std::is_trivially_destructible_v<std::expected<void, NonTrivial>>);31 32struct TrackedDestroy {33  bool& destroyed;34  constexpr TrackedDestroy(bool& b) : destroyed(b) {}35  constexpr ~TrackedDestroy() { destroyed = true; }36};37 38constexpr bool test() {39  // has value40  { [[maybe_unused]] std::expected<void, TrackedDestroy> e(std::in_place); }41 42  // has error43  {44    bool errorDestroyed = false;45    { [[maybe_unused]] std::expected<void, TrackedDestroy> e(std::unexpect, errorDestroyed); }46    assert(errorDestroyed);47  }48 49  return true;50}51 52int main(int, char**) {53  test();54  static_assert(test());55  return 0;56}57