#pragma once
#ifndef ARDUINO_ARCH_AVR
#include "Cpp_Standard_Library.h"
#include _CSL_Official(exception)
#endif
// Exception Handling support header for -*- C++ -*-

// Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2002
// Free Software Foundation
//
// This file is part of GNU CC.
//
// GNU CC 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 2, or (at your option)
// any later version.
//
// GNU CC 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.
//
// You should have received a copy of the GNU General Public License
// along with GNU CC; see the file COPYING.  If not, write to
// the Free Software Foundation, 59 Temple Place - Suite 330,
// Boston, MA 02111-1307, USA.

// As a special exception, you may use this file as part of a free software
// library without restriction.  Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License.  This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.

/** @file exception
 *  This header defines several types and functions relating to the
 *  handling of exceptions in a C++ program.
 */
#ifdef ARDUINO_ARCH_AVR
#include "basic_definitions"
#include <bits/c++config.h>
#include <bits/exception.h>
#endif
extern "C++"
{
    namespace std
    {
#ifdef ARDUINO_ARCH_AVR
        /** @addtogroup exceptions
         *  @{
         */

        /** If an %exception is thrown which is not listed in a function's
         *  %exception specification, one of these may be thrown.
         *
         *  @ingroup exceptions
         */
        class bad_exception : public exception
        {
        public:
            bad_exception() _GLIBCXX_USE_NOEXCEPT {}

            // This declaration is not useless:
            // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
            virtual ~bad_exception() _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT;

            // See comment in eh_exception.cc.
            virtual const char *
            what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT;
        };

        /// If you write a replacement %terminate handler, it must be of this type.
        typedef void (*terminate_handler)();
// 70
#endif
#ifndef ARDUINO_ARCH_ESP32
// 73
#if __cplusplus >= 201103L
        /// Return the current terminate handler.
        terminate_handler get_terminate() noexcept;
#endif
#ifdef ARDUINO_ARCH_AVR
        /** The runtime will call this function if %exception handling must be
         *  abandoned for any reason.  It can also be called by the user.  */
        void terminate() _GLIBCXX_USE_NOEXCEPT __attribute__((__noreturn__, __cold__));
#endif
#if __cplusplus < 201703L || (__cplusplus <= 202002L && _GLIBCXX_USE_DEPRECATED) && !defined ARDUINO_ARCH_ESP32
#ifdef ARDUINO_ARCH_AVR
        /// If you write a replacement %unexpected handler, it must be of this type.
        typedef void (*_GLIBCXX11_DEPRECATED unexpected_handler)();

        /** Takes a new handler function as an argument, returns the old function.
         *
         * @deprecated Removed from the C++ standard in C++17
         */
        _GLIBCXX11_DEPRECATED
        unexpected_handler set_unexpected(unexpected_handler) _GLIBCXX_USE_NOEXCEPT;
#endif
#if __cplusplus >= 201103L
        /** Return the current unexpected handler.
         *
         * @since C++11
         * @deprecated Removed from the C++ standard in C++17
         */
        _GLIBCXX11_DEPRECATED
        unexpected_handler get_unexpected() noexcept;
#endif
#ifdef ARDUINO_ARCH_AVR
        /** The runtime will call this function if an %exception is thrown which
         *  violates the function's %exception specification.
         *
         * @deprecated Removed from the C++ standard in C++17
         */
        _GLIBCXX11_DEPRECATED
        void unexpected() __attribute__((__noreturn__, __cold__));
#endif
#endif
#endif
#ifdef ARDUINO_ARCH_AVR
        /** [18.6.4]/1:  'Returns true after completing evaluation of a
         *  throw-expression until either completing initialization of the
         *  exception-declaration in the matching handler or entering `unexpected()`
         *  due to the throw; or after entering `terminate()` for any reason
         *  other than an explicit call to `terminate()`.  [Note: This includes
         *  stack unwinding [15.2].  end note]'
         *
         *  2: 'When `uncaught_exception()` is true, throwing an
         *  %exception can result in a call of 1terminate()`
         *  (15.5.1).'
         */
        _GLIBCXX17_DEPRECATED_SUGGEST("std::uncaught_exceptions()")
        bool uncaught_exception() _GLIBCXX_USE_NOEXCEPT __attribute__((__pure__));
#endif
        // 126
    } // namespace std
} // extern "C++"