135ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier//===----------------------------------------------------------------------===//
235ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier//
335ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier//                     The LLVM Compiler Infrastructure
435ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier//
535ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier// This file is dual licensed under the MIT and the University of Illinois Open
635ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier// Source Licenses. See LICENSE.TXT for details.
735ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier//
835ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier//===----------------------------------------------------------------------===//
935ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier
1035ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier// UNSUPPORTED: c++98, c++03, c++11, c++14
1135ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier
1235ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier// <optional>
1335ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier
1435ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier// void reset() noexcept;
1535ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier
1635ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier#include <optional>
1735ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier#include <type_traits>
1835ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier#include <cassert>
1935ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier
2035ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselierusing std::optional;
2135ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier
2235ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselierstruct X
2335ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier{
2435ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier    static bool dtor_called;
2535ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier    ~X() {dtor_called = true;}
2635ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier};
2735ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier
2835ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselierbool X::dtor_called = false;
2935ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier
3035ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselierint main()
3135ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier{
3235ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier    {
3335ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        optional<int> opt;
3435ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        static_assert(noexcept(opt.reset()) == true, "");
3535ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        opt.reset();
3635ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        assert(static_cast<bool>(opt) == false);
3735ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier    }
3835ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier    {
3935ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        optional<int> opt(3);
4035ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        opt.reset();
4135ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        assert(static_cast<bool>(opt) == false);
4235ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier    }
4335ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier    {
4435ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        optional<X> opt;
4535ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        static_assert(noexcept(opt.reset()) == true, "");
4635ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        assert(X::dtor_called == false);
4735ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        opt.reset();
4835ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        assert(X::dtor_called == false);
4935ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        assert(static_cast<bool>(opt) == false);
5035ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier    }
5135ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier    assert(X::dtor_called == false); // TRANSITION, Clang/C2 VSO#239997
5235ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier    {
5335ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        optional<X> opt(X{});
5435ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        X::dtor_called = false;
5535ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        opt.reset();
5635ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        assert(X::dtor_called == true);
5735ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        assert(static_cast<bool>(opt) == false);
5835ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier        X::dtor_called = false;
5935ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier    }
6035ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier    assert(X::dtor_called == false); // TRANSITION, Clang/C2 VSO#239997
6135ce4859dd7cc2b7ed280cecc0fe0d9cabe6461bEric Fiselier}
62