//===----------------------------------------------------------------------===//
//
// 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: no-threads
// UNSUPPORTED: libcpp-has-no-experimental-stop_token
// UNSUPPORTED: c++03, c++11, c++14, c++17
// XFAIL: availability-synchronization_library-missing

// void detach();

#include <atomic>
#include <cassert>
#include <chrono>
#include <concepts>
#include <functional>
#include <optional>
#include <system_error>
#include <thread>
#include <type_traits>

#include "test_macros.h"

int main(int, char**) {
  // Effects: The thread represented by *this continues execution without the calling thread blocking.
  {
    std::atomic_bool start{false};
    std::atomic_bool done{false};
    std::optional<std::jthread> jt{[&start, &done] {
      start.wait(false);
      done = true;
    }};

    // If it blocks, it will deadlock here
    jt->detach();

    jt.reset();

    // The other thread continues execution
    start = true;
    start.notify_all();
    while (!done) {
    }
  }

  // Postconditions: get_id() == id().
  {
    std::jthread jt{[] {}};
    assert(jt.get_id() != std::jthread::id());
    jt.detach();
    assert(jt.get_id() == std::jthread::id());
  }

#if !defined(TEST_HAS_NO_EXCEPTIONS)
  // Throws: system_error when an exception is required ([thread.req.exception]).
  // invalid_argument - if the thread is not joinable.
  {
    std::jthread jt;
    try {
      jt.detach();
      assert(false);
    } catch (const std::system_error& err) {
      assert(err.code() == std::errc::invalid_argument);
    }
  }
#endif

  std::this_thread::sleep_for(std::chrono::milliseconds{2});
  return 0;
}
