mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-11-29 02:39:56 +08:00
8977f4bec6
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.
142 lines
3.3 KiB
D
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"; }
|
|
}
|
|
}
|