gcc/libphobos/libdruntime/core/stdcpp/exception.d
Iain Buclaw 8977f4bec6 d: Merge upstream dmd 423f19b41, druntime 100a608c, phobos a1f8c4c07.
D Runtime changes:

    - Fix stdc.stdio bindings to not depend on druntime (PR104729).
    - Implement stdc.math for Solaris (PR104735).

gcc/d/ChangeLog:

	* dmd/MERGE: Merge upstream dmd 423f19b41.

libphobos/ChangeLog:

	* libdruntime/MERGE: Merge upstream druntime 100a608c.
	* src/MERGE: Merge upstream phobos a1f8c4c07.
2022-03-02 18:21:38 +01:00

142 lines
3.3 KiB
D

// Written in the D programming language.
/**
* Interface to C++ <exception>
*
* Copyright: Copyright (c) 2016 D Language Foundation
* License: $(HTTP boost.org/LICENSE_1_0.txt, Boost License 1.0).
* Authors: $(HTTP digitalmars.com, Walter Bright)
* Manu Evans
* Source: $(DRUNTIMESRC core/stdcpp/_exception.d)
*/
module core.stdcpp.exception;
import core.stdcpp.xutility : __cplusplus, CppStdRevision;
import core.attribute : weak;
version (CppRuntime_Gcc)
version = GenericBaseException;
version (CppRuntime_Clang)
version = GenericBaseException;
version (CppRuntime_Sun)
version = GenericBaseException;
extern (C++, "std"):
@nogc:
///
alias terminate_handler = void function() nothrow;
///
terminate_handler set_terminate(terminate_handler f) nothrow;
///
terminate_handler get_terminate() nothrow;
///
void terminate() nothrow;
static if (__cplusplus < CppStdRevision.cpp17)
{
///
alias unexpected_handler = void function();
///
deprecated unexpected_handler set_unexpected(unexpected_handler f) nothrow;
///
deprecated unexpected_handler get_unexpected() nothrow;
///
deprecated void unexpected();
}
static if (__cplusplus < CppStdRevision.cpp17)
{
///
bool uncaught_exception() nothrow;
}
else static if (__cplusplus == CppStdRevision.cpp17)
{
///
deprecated bool uncaught_exception() nothrow;
}
static if (__cplusplus >= CppStdRevision.cpp17)
{
///
int uncaught_exceptions() nothrow;
}
version (GenericBaseException)
{
///
class exception
{
@nogc:
///
extern(D) this() nothrow {}
///
@weak ~this() nothrow {} // HACK: this should extern, but then we have link errors!
///
@weak const(char)* what() const nothrow { return "unknown"; } // HACK: this should extern, but then we have link errors!
protected:
extern(D) this(const(char)*, int = 1) nothrow { this(); } // compat with MS derived classes
}
}
else version (CppRuntime_DigitalMars)
{
///
class exception
{
@nogc:
///
extern(D) this() nothrow {}
//virtual ~this();
void dtor() { } // reserve slot in vtbl[]
///
const(char)* what() const nothrow;
protected:
this(const(char)*, int = 1) nothrow { this(); } // compat with MS derived classes
}
}
else version (CppRuntime_Microsoft)
{
///
class exception
{
@nogc:
///
extern(D) this(const(char)* message = "unknown", int = 1) nothrow { msg = message; }
///
@weak ~this() nothrow {}
///
@weak const(char)* what() const nothrow { return msg != null ? msg : "unknown exception"; }
// TODO: do we want this? exceptions are classes... ref types.
// final ref exception opAssign(ref const(exception) e) nothrow { msg = e.msg; return this; }
protected:
@weak void _Doraise() const { assert(0); }
protected:
const(char)* msg;
}
}
else
static assert(0, "Missing std::exception binding for this platform");
///
class bad_exception : exception
{
@nogc:
///
extern(D) this(const(char)* message = "bad exception") nothrow { super(message); }
version (GenericBaseException)
{
///
@weak override const(char)* what() const nothrow { return "bad exception"; }
}
}