// Exception Handling support header (exception_ptr class) for -*- C++ -*-

// Copyright (C) 2008-2026 Free Software Foundation, Inc.
//
// This file is part of GCC.
//
// GCC is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3, or (at your option)
// any later version.
//
// GCC is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.

// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// <http://www.gnu.org/licenses/>.

/** @file bits/exception_ptr.h
 *  This is an internal header file, included by other library headers.
 *  Do not attempt to use it directly. @headername{exception}
 */

#ifndef _EXCEPTION_PTR_H
#define _EXCEPTION_PTR_H

#include <bits/c++config.h>
#include <bits/exception_defines.h>
#include <bits/cxxabi_init_exception.h>
#include <typeinfo>
#include <new>

#if __cplusplus >= 201103L
# include <bits/move.h>
#endif

#ifdef _GLIBCXX_EH_PTR_RELOPS_COMPAT
# define _GLIBCXX_EH_PTR_USED __attribute__((__used__))
#else
# define _GLIBCXX_EH_PTR_USED
#endif

extern "C++" {

namespace std _GLIBCXX_VISIBILITY(default)
{
  class type_info;

  /**
   * @addtogroup exceptions
   * @{
   */

  namespace __exception_ptr
  {
    class exception_ptr;
  }

  using __exception_ptr::exception_ptr;

  /** Obtain an exception_ptr to the currently handled exception.
   *
   * If there is none, or the currently handled exception is foreign,
   * return the null value.
   *
   * @since C++11
   */
  exception_ptr current_exception() _GLIBCXX_USE_NOEXCEPT;

  template<typename _Ex>
  _GLIBCXX26_CONSTEXPR exception_ptr make_exception_ptr(_Ex)
  _GLIBCXX_USE_NOEXCEPT;

  /// Throw the object pointed to by the exception_ptr.
  void rethrow_exception(exception_ptr) __attribute__ ((__noreturn__));

#if __cpp_lib_exception_ptr_cast >= 202506L
  template<typename _Ex>
    constexpr const _Ex* exception_ptr_cast(const exception_ptr&) noexcept;
  template<typename _Ex>
    void exception_ptr_cast(const exception_ptr&&) = delete;
#endif

  namespace __exception_ptr
  {
    using std::rethrow_exception; // So that ADL finds it.

    /**
     *  @brief An opaque pointer to an arbitrary exception.
     *
     * The actual name of this type is unspecified, so the alias
     * `std::exception_ptr` should be used to refer to it.
     *
     *  @headerfile exception
     *  @since C++11 (but usable in C++98 as a GCC extension)
     *  @ingroup exceptions
     */
    class exception_ptr
    {
      void* _M_exception_object;

#if __cplusplus >= 202400L
      [[__gnu__::__gnu_inline__]]
      constexpr inline explicit exception_ptr(void* __e) noexcept
      : _M_exception_object(__e)
      {
	if (_M_exception_object)
	  {
#if __cpp_if_consteval >= 202106L \
  && _GLIBCXX_HAS_BUILTIN(__builtin_eh_ptr_adjust_ref)
	    if consteval {
	      __builtin_eh_ptr_adjust_ref(_M_exception_object, 1);
	      return;
	    }
#endif
	    _M_addref();
	  }
      }
#else
      explicit exception_ptr(void* __e) _GLIBCXX_USE_NOEXCEPT;
#endif

      void _M_addref() _GLIBCXX_USE_NOEXCEPT;
      void _M_release() _GLIBCXX_USE_NOEXCEPT;

      void *_M_get() const _GLIBCXX_NOEXCEPT __attribute__ ((__pure__));

      friend exception_ptr std::current_exception() _GLIBCXX_USE_NOEXCEPT;
      friend void std::rethrow_exception(exception_ptr);
      template<typename _Ex>
      friend _GLIBCXX26_CONSTEXPR exception_ptr std::make_exception_ptr(_Ex)
	_GLIBCXX_USE_NOEXCEPT;
#if __cpp_lib_exception_ptr_cast >= 202506L
      template<typename _Ex>
	friend constexpr const _Ex*
	std::exception_ptr_cast(const exception_ptr&) noexcept;
#endif

      const void* _M_exception_ptr_cast(const type_info&) const
	_GLIBCXX_USE_NOEXCEPT;

    public:
      _GLIBCXX26_CONSTEXPR exception_ptr() _GLIBCXX_USE_NOEXCEPT;

      _GLIBCXX26_CONSTEXPR exception_ptr(const exception_ptr&)
	_GLIBCXX_USE_NOEXCEPT;

#if __cplusplus >= 201103L
      _GLIBCXX26_CONSTEXPR exception_ptr(nullptr_t) noexcept
      : _M_exception_object(nullptr)
      { }

      _GLIBCXX26_CONSTEXPR exception_ptr(exception_ptr&& __o) noexcept
      : _M_exception_object(__o._M_exception_object)
      { __o._M_exception_object = nullptr; }
#endif

#if (__cplusplus < 201103L) || defined (_GLIBCXX_EH_PTR_COMPAT)
      typedef void (exception_ptr::*__safe_bool)();

      // For construction from nullptr or 0.
      exception_ptr(__safe_bool) _GLIBCXX_USE_NOEXCEPT;
#endif

      _GLIBCXX26_CONSTEXPR exception_ptr&
      operator=(const exception_ptr&) _GLIBCXX_USE_NOEXCEPT;

#if __cplusplus >= 201103L
      _GLIBCXX26_CONSTEXPR exception_ptr&
      operator=(exception_ptr&& __o) noexcept
      {
        exception_ptr(static_cast<exception_ptr&&>(__o)).swap(*this);
        return *this;
      }
#endif

      _GLIBCXX26_CONSTEXPR ~exception_ptr() _GLIBCXX_USE_NOEXCEPT;

      _GLIBCXX26_CONSTEXPR void
      swap(exception_ptr&) _GLIBCXX_USE_NOEXCEPT;

#ifdef _GLIBCXX_EH_PTR_COMPAT
      // Retained for compatibility with CXXABI_1.3.
      void _M_safe_bool_dummy() _GLIBCXX_USE_NOEXCEPT;
      bool operator!() const _GLIBCXX_USE_NOEXCEPT
	__attribute__ ((__pure__));
      operator __safe_bool() const _GLIBCXX_USE_NOEXCEPT;
#endif

#if __cplusplus >= 201103L
      _GLIBCXX26_CONSTEXPR explicit operator bool() const noexcept
      { return _M_exception_object; }
#endif

#if __cpp_impl_three_way_comparison >= 201907L \
      && ! defined _GLIBCXX_EH_PTR_RELOPS_COMPAT
      _GLIBCXX26_CONSTEXPR friend bool
      operator==(const exception_ptr&, const exception_ptr&) noexcept = default;
#else
      friend _GLIBCXX_EH_PTR_USED bool
      operator==(const exception_ptr& __x, const exception_ptr& __y)
      _GLIBCXX_USE_NOEXCEPT
      { return __x._M_exception_object == __y._M_exception_object; }

      friend _GLIBCXX_EH_PTR_USED bool
      operator!=(const exception_ptr& __x, const exception_ptr& __y)
      _GLIBCXX_USE_NOEXCEPT
      { return __x._M_exception_object != __y._M_exception_object; }
#endif

      // Friend for ADL with module std.
      friend _GLIBCXX26_CONSTEXPR void
      swap(exception_ptr& __lhs, exception_ptr& __rhs);

      const class std::type_info*
      __cxa_exception_type() const _GLIBCXX_USE_NOEXCEPT
	__attribute__ ((__pure__));
    };

    _GLIBCXX_EH_PTR_USED
    _GLIBCXX26_CONSTEXPR inline
    exception_ptr::exception_ptr() _GLIBCXX_USE_NOEXCEPT
    : _M_exception_object(0)
    { }

    _GLIBCXX_EH_PTR_USED
    _GLIBCXX26_CONSTEXPR inline
    exception_ptr::exception_ptr(const exception_ptr& __other)
    _GLIBCXX_USE_NOEXCEPT
    : _M_exception_object(__other._M_exception_object)
    {
      if (_M_exception_object)
	{
#if __cpp_if_consteval >= 202106L \
  && _GLIBCXX_HAS_BUILTIN(__builtin_eh_ptr_adjust_ref)
	  if consteval {
	    __builtin_eh_ptr_adjust_ref(_M_exception_object, 1);
	    return;
	  }
#endif
	  _M_addref();
	}
    }

    _GLIBCXX_EH_PTR_USED
    _GLIBCXX26_CONSTEXPR inline
    exception_ptr::~exception_ptr() _GLIBCXX_USE_NOEXCEPT
    {
      if (_M_exception_object)
	{
#if __cpp_if_consteval >= 202106L \
  && _GLIBCXX_HAS_BUILTIN(__builtin_eh_ptr_adjust_ref)
	  if consteval {
	    __builtin_eh_ptr_adjust_ref(_M_exception_object, -1);
	    return;
	  }
#endif
	  _M_release();
	}
    }

    _GLIBCXX_EH_PTR_USED
    _GLIBCXX26_CONSTEXPR inline exception_ptr&
    exception_ptr::operator=(const exception_ptr& __other) _GLIBCXX_USE_NOEXCEPT
    {
      exception_ptr(__other).swap(*this);
      return *this;
    }

    _GLIBCXX_EH_PTR_USED
    _GLIBCXX26_CONSTEXPR inline void
    exception_ptr::swap(exception_ptr &__other) _GLIBCXX_USE_NOEXCEPT
    {
      void *__tmp = _M_exception_object;
      _M_exception_object = __other._M_exception_object;
      __other._M_exception_object = __tmp;
    }

    /// @relates exception_ptr
    _GLIBCXX26_CONSTEXPR inline void
    swap(exception_ptr& __lhs, exception_ptr& __rhs)
    { __lhs.swap(__rhs); }

    /// @cond undocumented
    template<typename _Ex>
      _GLIBCXX_CDTOR_CALLABI
      inline void
      __dest_thunk(void* __x)
      { static_cast<_Ex*>(__x)->~_Ex(); }
    /// @endcond

  } // namespace __exception_ptr

  using __exception_ptr::swap; // So that std::swap(exp1, exp2) finds it.

  /// Obtain an exception_ptr pointing to a copy of the supplied object.
  template<typename _Ex>
#if !(__cplusplus >= 201103L && __cpp_rtti) && !__cpp_exceptions
    // This is always_inline so the linker will never use a useless definition
    // instead of a working one compiled with RTTI and/or exceptions enabled.
    __attribute__ ((__always_inline__)) inline
#endif
    _GLIBCXX26_CONSTEXPR exception_ptr
    make_exception_ptr(_Ex __ex) _GLIBCXX_USE_NOEXCEPT
    {
#if __cplusplus >= 201103L && __cpp_rtti
      // For runtime calls with -frtti enabled we can avoid try-catch overhead.
      // We can't use this for C++98 because it relies on std::decay.
#ifdef __glibcxx_constexpr_exceptions
      if ! consteval
#endif
	{
	  using _Ex2 = typename decay<_Ex>::type;
	  void* __e = __cxxabiv1::__cxa_allocate_exception(sizeof(_Ex));
	  (void) __cxxabiv1::__cxa_init_primary_exception(
	      __e, const_cast<std::type_info*>(&typeid(_Ex)),
	      __exception_ptr::__dest_thunk<_Ex2>);
	  __try
	    {
	      ::new (__e) _Ex2(__ex);
	      return exception_ptr(__e);
	    }
	  __catch(...)
	    {
	      __cxxabiv1::__cxa_free_exception(__e);
	      return current_exception();
	    }
	}
#endif

#ifdef __cpp_exceptions
      try
	{
          throw __ex;
	}
      catch(...)
	{
#if _GLIBCXX_USE_BUILTIN_TRAIT(__builtin_current_exception)
	  return __builtin_current_exception();
#else
	  return current_exception();
#endif
	}
#endif
      return exception_ptr();
    }

#if __cpp_lib_exception_ptr_cast >= 202506L
  template<typename _Ex>
    [[__gnu__::__always_inline__]]
    constexpr const _Ex*
    exception_ptr_cast(const exception_ptr& __p) noexcept
    {
      static_assert(!std::is_const_v<_Ex>);
      static_assert(!std::is_reference_v<_Ex>);
      static_assert(std::is_object_v<_Ex>);
      static_assert(!std::is_array_v<_Ex>);
      static_assert(!std::is_pointer_v<_Ex>);
      static_assert(!std::is_member_pointer_v<_Ex>);

#ifdef __cpp_rtti
      // For runtime calls with -frtti enabled we can avoid try-catch overhead.
      if ! consteval {
	const type_info &__id = typeid(const _Ex&);
	return static_cast<const _Ex*>(__p._M_exception_ptr_cast(__id));
      }
#endif

#ifdef __cpp_exceptions
      if (__p._M_exception_object)
	try
	  {
	    std::rethrow_exception(__p);
	  }
	catch (const _Ex& __exc)
	  {
	    return &__exc;
	  }
	catch (...)
	  {
	  }
#endif

      return nullptr;
    }
#endif

#undef _GLIBCXX_EH_PTR_USED

  /// @} group exceptions
} // namespace std

} // extern "C++"

#endif
