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