llvm/libcxx/test/std/utilities/smartptr/adapt/inout_ptr/inout_ptr_t.ctor.pass.cpp

//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20

// <memory>

// [inout.ptr.t], class template inout_ptr_t
// template<class Smart, class Pointer, class... Args>
//   class inout_ptr_t;                                        // since c++23

// explicit inout_ptr_t(Smart&, Args...);

#include <cassert>
#include <memory>

#include "test_convertible.h"
#include "../types.h"

int main(int, char**) {
  {
    std::unique_ptr<int> uPtr;

    std::inout_ptr_t<std::unique_ptr<int>, int*>{uPtr};

    static_assert(
        !test_convertible<std::inout_ptr_t<std::unique_ptr<int>, int*>>(), "This constructor must be explicit");

    // Test the state of the pointer after construction. Complete tests are available in inout_ptr.general.pass.cpp.
    assert(uPtr == nullptr);
  }

  {
    auto deleter = [](auto* p) { delete p; };
    std::unique_ptr<int, decltype(deleter)> uPtr;

    std::inout_ptr_t<std::unique_ptr<int, decltype(deleter)>, int*>{uPtr};

    static_assert(!test_convertible<std::inout_ptr_t<std::unique_ptr<int, decltype(deleter)>, int*>>(),
                  "This constructor must be explicit");

    // Test the state of the pointer after construction. Complete tests are available in inout_ptr.general.pass.cpp.
    assert(uPtr == nullptr);
  }

  {
    std::unique_ptr<int, MoveOnlyDeleter<int>> uPtr;

    std::inout_ptr_t<decltype(uPtr), int*, MoveOnlyDeleter<int>>{uPtr, MoveOnlyDeleter<int>{}};

    // Test the state of the pointer after construction. Complete tests are available in inout_ptr.general.pass.cpp.
    assert(uPtr == nullptr);
  }

  return 0;
}