#include "prx/libc/include/general/VabiMacros.hpp" #include #include #include struct TypeRecord { const void* const* vtable; const char* name; const TypeRecord* base; }; struct Object { const void* vtable; const char* message; }; struct Vtable { std::ptrdiff_t offset; const TypeRecord* type; const void* destroy; const void* deleteObject; const void* what; }; extern "C" { extern const TypeRecord _ZTISt13runtime_error_nid_postfix; extern const TypeRecord _ZTISt14overflow_error_nid_postfix; extern const Vtable _ZTVSt13runtime_error_nid_postfix; extern const Vtable _ZTVSt14overflow_error_nid_postfix; void APS5_VABI _ZNSt13runtime_errorC1EPKc_nid_postfix(Object*, const char*); void APS5_VABI _ZNSt14overflow_errorD1Ev_nid_postfix(Object*); } static void Require(bool value) { if (!value) std::abort(); } int main() { const auto& type = _ZTISt14overflow_error_nid_postfix; const auto& runtimeType = _ZTISt13runtime_error_nid_postfix; Require(std::strcmp(type.name, "St14overflow_error") == 0); Require(type.base == &runtimeType && type.vtable == runtimeType.vtable); const auto& table = _ZTVSt14overflow_error_nid_postfix; const auto& runtimeTable = _ZTVSt13runtime_error_nid_postfix; Require(table.offset == 0 && table.type == &type); Require(table.destroy == runtimeTable.destroy && table.deleteObject == runtimeTable.deleteObject && table.what == runtimeTable.what); Object object{}; _ZNSt13runtime_errorC1EPKc_nid_postfix(&object, "value too large"); Require(object.message != nullptr && std::strcmp(object.message, "value too large") == 0); _ZNSt14overflow_errorD1Ev_nid_postfix(&object); Require(object.message == nullptr); _ZNSt14overflow_errorD1Ev_nid_postfix(&object); Require(object.message == nullptr); return 0; }