brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 9d0843b Raw
105 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++1410// <optional>11 12// optional<T>& operator=(nullopt_t) noexcept;13 14#include <optional>15#include <type_traits>16#include <cassert>17 18#include "test_macros.h"19#include "archetypes.h"20 21using std::optional;22using std::nullopt_t;23using std::nullopt;24 25TEST_CONSTEXPR_CXX20 bool test()26{27    enum class State { inactive, constructed, destroyed };28    State state = State::inactive;29 30    struct StateTracker {31      TEST_CONSTEXPR_CXX20 StateTracker(State& s)32      : state_(&s)33      {34        s = State::constructed;35      }36      TEST_CONSTEXPR_CXX20 ~StateTracker() { *state_ = State::destroyed; }37 38      State* state_;39    };40    {41        optional<int> opt;42        static_assert(noexcept(opt = nullopt) == true, "");43        opt = nullopt;44        assert(static_cast<bool>(opt) == false);45    }46    {47        optional<int> opt(3);48        opt = nullopt;49        assert(static_cast<bool>(opt) == false);50    }51    {52        optional<StateTracker> opt;53        opt = nullopt;54        assert(state == State::inactive);55        assert(static_cast<bool>(opt) == false);56    }57    {58        optional<StateTracker> opt(state);59        assert(state == State::constructed);60        opt = nullopt;61        assert(state == State::destroyed);62        assert(static_cast<bool>(opt) == false);63    }64    return true;65}66 67 68int main(int, char**)69{70#if TEST_STD_VER > 1771    static_assert(test());72#endif73    test();74    using TT = TestTypes::TestType;75    TT::reset();76    {77        optional<TT> opt;78        static_assert(noexcept(opt = nullopt) == true, "");79        assert(TT::destroyed == 0);80        opt = nullopt;81        assert(TT::constructed == 0);82        assert(TT::alive == 0);83        assert(TT::destroyed == 0);84        assert(static_cast<bool>(opt) == false);85    }86    assert(TT::alive == 0);87    assert(TT::destroyed == 0);88    TT::reset();89    {90        optional<TT> opt(42);91        assert(TT::destroyed == 0);92        TT::reset_constructors();93        opt = nullopt;94        assert(TT::constructed == 0);95        assert(TT::alive == 0);96        assert(TT::destroyed == 1);97        assert(static_cast<bool>(opt) == false);98    }99    assert(TT::alive == 0);100    assert(TT::destroyed == 1);101    TT::reset();102 103  return 0;104}105