xref: /reactos/sdk/lib/crt/wine/cppexcept.h (revision 3a61dd7f)
19efafd64STimo Kreuzer /*
29efafd64STimo Kreuzer  * msvcrt C++ exception handling
39efafd64STimo Kreuzer  *
49efafd64STimo Kreuzer  * Copyright 2002 Alexandre Julliard
59efafd64STimo Kreuzer  *
69efafd64STimo Kreuzer  * This library is free software; you can redistribute it and/or
79efafd64STimo Kreuzer  * modify it under the terms of the GNU Lesser General Public
89efafd64STimo Kreuzer  * License as published by the Free Software Foundation; either
99efafd64STimo Kreuzer  * version 2.1 of the License, or (at your option) any later version.
109efafd64STimo Kreuzer  *
119efafd64STimo Kreuzer  * This library is distributed in the hope that it will be useful,
129efafd64STimo Kreuzer  * but WITHOUT ANY WARRANTY; without even the implied warranty of
139efafd64STimo Kreuzer  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
149efafd64STimo Kreuzer  * Lesser General Public License for more details.
159efafd64STimo Kreuzer  *
169efafd64STimo Kreuzer  * You should have received a copy of the GNU Lesser General Public
179efafd64STimo Kreuzer  * License along with this library; if not, write to the Free Software
189efafd64STimo Kreuzer  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
199efafd64STimo Kreuzer  */
209efafd64STimo Kreuzer 
219efafd64STimo Kreuzer #ifndef __MSVCRT_CPPEXCEPT_H
229efafd64STimo Kreuzer #define __MSVCRT_CPPEXCEPT_H
239efafd64STimo Kreuzer 
249efafd64STimo Kreuzer #include "wine/asm.h"
259efafd64STimo Kreuzer 
269efafd64STimo Kreuzer #define CXX_FRAME_MAGIC_VC6 0x19930520
279efafd64STimo Kreuzer #define CXX_FRAME_MAGIC_VC7 0x19930521
289efafd64STimo Kreuzer #define CXX_FRAME_MAGIC_VC8 0x19930522
299efafd64STimo Kreuzer #define CXX_EXCEPTION       0xe06d7363
309efafd64STimo Kreuzer 
319efafd64STimo Kreuzer #define FUNC_DESCR_SYNCHRONOUS  1 /* synchronous exceptions only (built with /EHs and /EHsc) */
32*3a61dd7fSTimo Kreuzer #define FUNC_DESCR_NOEXCEPT     4 /* noexcept function */
339efafd64STimo Kreuzer 
349efafd64STimo Kreuzer typedef void (*vtable_ptr)(void);
359efafd64STimo Kreuzer 
369efafd64STimo Kreuzer /* type_info object, see cpp.c for implementation */
379efafd64STimo Kreuzer typedef struct __type_info
389efafd64STimo Kreuzer {
399efafd64STimo Kreuzer   const vtable_ptr *vtable;
409efafd64STimo Kreuzer   char              *name;        /* Unmangled name, allocated lazily */
419efafd64STimo Kreuzer   char               mangled[64]; /* Variable length, but we declare it large enough for static RTTI */
429efafd64STimo Kreuzer } type_info;
439efafd64STimo Kreuzer 
449efafd64STimo Kreuzer /* exception object */
459efafd64STimo Kreuzer typedef struct __exception
469efafd64STimo Kreuzer {
479efafd64STimo Kreuzer   const vtable_ptr *vtable;
489efafd64STimo Kreuzer   char             *name;    /* Name of this exception, always a new copy for each object */
499efafd64STimo Kreuzer   BOOL              do_free; /* Whether to free 'name' in our dtor */
509efafd64STimo Kreuzer } exception;
519efafd64STimo Kreuzer 
529efafd64STimo Kreuzer typedef void (*cxx_copy_ctor)(void);
539efafd64STimo Kreuzer 
549efafd64STimo Kreuzer /* offsets for computing the this pointer */
559efafd64STimo Kreuzer typedef struct
569efafd64STimo Kreuzer {
579efafd64STimo Kreuzer     int         this_offset;   /* offset of base class this pointer from start of object */
589efafd64STimo Kreuzer     int         vbase_descr;   /* offset of virtual base class descriptor */
599efafd64STimo Kreuzer     int         vbase_offset;  /* offset of this pointer offset in virtual base class descriptor */
609efafd64STimo Kreuzer } this_ptr_offsets;
619efafd64STimo Kreuzer 
629efafd64STimo Kreuzer /* complete information about a C++ type */
639efafd64STimo Kreuzer #ifndef __x86_64__
649efafd64STimo Kreuzer typedef struct __cxx_type_info
659efafd64STimo Kreuzer {
669efafd64STimo Kreuzer     UINT             flags;        /* flags (see CLASS_* flags below) */
679efafd64STimo Kreuzer     const type_info *type_info;    /* C++ type info */
689efafd64STimo Kreuzer     this_ptr_offsets offsets;      /* offsets for computing the this pointer */
699efafd64STimo Kreuzer     unsigned int     size;         /* object size */
709efafd64STimo Kreuzer     cxx_copy_ctor    copy_ctor;    /* copy constructor */
719efafd64STimo Kreuzer } cxx_type_info;
729efafd64STimo Kreuzer #else
739efafd64STimo Kreuzer typedef struct __cxx_type_info
749efafd64STimo Kreuzer {
759efafd64STimo Kreuzer     UINT flags;
769efafd64STimo Kreuzer     unsigned int type_info;
779efafd64STimo Kreuzer     this_ptr_offsets offsets;
789efafd64STimo Kreuzer     unsigned int size;
799efafd64STimo Kreuzer     unsigned int copy_ctor;
809efafd64STimo Kreuzer } cxx_type_info;
819efafd64STimo Kreuzer #endif
829efafd64STimo Kreuzer 
839efafd64STimo Kreuzer #define CLASS_IS_SIMPLE_TYPE          1
849efafd64STimo Kreuzer #define CLASS_HAS_VIRTUAL_BASE_CLASS  4
859efafd64STimo Kreuzer 
869efafd64STimo Kreuzer /* table of C++ types that apply for a given object */
879efafd64STimo Kreuzer #ifndef __x86_64__
889efafd64STimo Kreuzer typedef struct __cxx_type_info_table
899efafd64STimo Kreuzer {
909efafd64STimo Kreuzer     UINT                 count;     /* number of types */
919efafd64STimo Kreuzer     const cxx_type_info *info[3];   /* variable length, we declare it large enough for static RTTI */
929efafd64STimo Kreuzer } cxx_type_info_table;
939efafd64STimo Kreuzer #else
949efafd64STimo Kreuzer typedef struct __cxx_type_info_table
959efafd64STimo Kreuzer {
969efafd64STimo Kreuzer     UINT count;
979efafd64STimo Kreuzer     unsigned int info[3];
989efafd64STimo Kreuzer } cxx_type_info_table;
999efafd64STimo Kreuzer #endif
1009efafd64STimo Kreuzer 
1019efafd64STimo Kreuzer struct __cxx_exception_frame;
1029efafd64STimo Kreuzer struct __cxx_function_descr;
1039efafd64STimo Kreuzer 
1049efafd64STimo Kreuzer typedef DWORD (*cxx_exc_custom_handler)( PEXCEPTION_RECORD, struct __cxx_exception_frame*,
1059efafd64STimo Kreuzer                                          PCONTEXT, EXCEPTION_REGISTRATION_RECORD**,
1069efafd64STimo Kreuzer                                          const struct __cxx_function_descr*, int nested_trylevel,
1079efafd64STimo Kreuzer                                          EXCEPTION_REGISTRATION_RECORD *nested_frame, DWORD unknown3 );
1089efafd64STimo Kreuzer 
1099efafd64STimo Kreuzer /* type information for an exception object */
1109efafd64STimo Kreuzer #ifndef __x86_64__
1119efafd64STimo Kreuzer typedef struct __cxx_exception_type
1129efafd64STimo Kreuzer {
1139efafd64STimo Kreuzer     UINT                       flags;            /* TYPE_FLAG flags */
1149efafd64STimo Kreuzer     void                     (*destructor)(void);/* exception object destructor */
1159efafd64STimo Kreuzer     cxx_exc_custom_handler     custom_handler;   /* custom handler for this exception */
1169efafd64STimo Kreuzer     const cxx_type_info_table *type_info_table;  /* list of types for this exception object */
1179efafd64STimo Kreuzer } cxx_exception_type;
1189efafd64STimo Kreuzer #else
1199efafd64STimo Kreuzer typedef struct
1209efafd64STimo Kreuzer {
1219efafd64STimo Kreuzer     UINT flags;
1229efafd64STimo Kreuzer     unsigned int destructor;
1239efafd64STimo Kreuzer     unsigned int custom_handler;
1249efafd64STimo Kreuzer     unsigned int type_info_table;
1259efafd64STimo Kreuzer } cxx_exception_type;
1269efafd64STimo Kreuzer #endif
1279efafd64STimo Kreuzer 
128*3a61dd7fSTimo Kreuzer void WINAPI _CxxThrowException(void*,const cxx_exception_type*);
1299efafd64STimo Kreuzer int CDECL _XcptFilter(NTSTATUS, PEXCEPTION_POINTERS);
1309efafd64STimo Kreuzer 
dbgstr_type_info(const type_info * info)1319efafd64STimo Kreuzer static inline const char *dbgstr_type_info( const type_info *info )
1329efafd64STimo Kreuzer {
1339efafd64STimo Kreuzer     if (!info) return "{}";
1349efafd64STimo Kreuzer     return wine_dbg_sprintf( "{vtable=%p name=%s (%s)}",
1359efafd64STimo Kreuzer                              info->vtable, info->mangled, info->name ? info->name : "" );
1369efafd64STimo Kreuzer }
1379efafd64STimo Kreuzer 
1389efafd64STimo Kreuzer /* compute the this pointer for a base class of a given type */
get_this_pointer(const this_ptr_offsets * off,void * object)1399efafd64STimo Kreuzer static inline void *get_this_pointer( const this_ptr_offsets *off, void *object )
1409efafd64STimo Kreuzer {
1419efafd64STimo Kreuzer     if (!object) return NULL;
1429efafd64STimo Kreuzer 
1439efafd64STimo Kreuzer     if (off->vbase_descr >= 0)
1449efafd64STimo Kreuzer     {
1459efafd64STimo Kreuzer         int *offset_ptr;
1469efafd64STimo Kreuzer 
1479efafd64STimo Kreuzer         /* move this ptr to vbase descriptor */
1489efafd64STimo Kreuzer         object = (char *)object + off->vbase_descr;
1499efafd64STimo Kreuzer         /* and fetch additional offset from vbase descriptor */
1509efafd64STimo Kreuzer         offset_ptr = (int *)(*(char **)object + off->vbase_offset);
1519efafd64STimo Kreuzer         object = (char *)object + *offset_ptr;
1529efafd64STimo Kreuzer     }
1539efafd64STimo Kreuzer 
1549efafd64STimo Kreuzer     object = (char *)object + off->this_offset;
1559efafd64STimo Kreuzer     return object;
1569efafd64STimo Kreuzer }
1579efafd64STimo Kreuzer 
1589efafd64STimo Kreuzer #ifndef __x86_64__
159*3a61dd7fSTimo Kreuzer #define DEFINE_CXX_TYPE_INFO(type) \
1609efafd64STimo Kreuzer static const cxx_type_info type ## _cxx_type_info = { \
1619efafd64STimo Kreuzer     0, \
1629efafd64STimo Kreuzer     & type ##_type_info, \
1639efafd64STimo Kreuzer     { 0, -1, 0 }, \
1649efafd64STimo Kreuzer     sizeof(type), \
165*3a61dd7fSTimo Kreuzer     (cxx_copy_ctor)THISCALL(type ##_copy_ctor) \
166*3a61dd7fSTimo Kreuzer };
167*3a61dd7fSTimo Kreuzer 
168*3a61dd7fSTimo Kreuzer #define DEFINE_CXX_EXCEPTION(type, base_no, cl1, cl2, dtor)  \
169*3a61dd7fSTimo Kreuzer static const cxx_type_info_table type ## _cxx_type_table = { \
1709efafd64STimo Kreuzer     base_no+1, \
1719efafd64STimo Kreuzer     { \
1729efafd64STimo Kreuzer         & type ## _cxx_type_info, \
1739efafd64STimo Kreuzer         cl1, \
174*3a61dd7fSTimo Kreuzer         cl2, \
1759efafd64STimo Kreuzer     } \
1769efafd64STimo Kreuzer }; \
1779efafd64STimo Kreuzer \
1789efafd64STimo Kreuzer static const cxx_exception_type type ## _exception_type = { \
1799efafd64STimo Kreuzer     0, \
180*3a61dd7fSTimo Kreuzer     (cxx_copy_ctor)THISCALL(dtor), \
1819efafd64STimo Kreuzer     NULL, \
182*3a61dd7fSTimo Kreuzer     & type ## _cxx_type_table \
1839efafd64STimo Kreuzer };
1849efafd64STimo Kreuzer 
1859efafd64STimo Kreuzer #else
1869efafd64STimo Kreuzer 
187*3a61dd7fSTimo Kreuzer #define DEFINE_CXX_TYPE_INFO(type) \
1889efafd64STimo Kreuzer static cxx_type_info type ## _cxx_type_info = { \
1899efafd64STimo Kreuzer     0, \
1909efafd64STimo Kreuzer     0xdeadbeef, \
1919efafd64STimo Kreuzer     { 0, -1, 0 }, \
1929efafd64STimo Kreuzer     sizeof(type), \
1939efafd64STimo Kreuzer     0xdeadbeef \
1949efafd64STimo Kreuzer }; \
1959efafd64STimo Kreuzer \
196*3a61dd7fSTimo Kreuzer static void init_ ## type ## _cxx_type_info(char *base) \
197*3a61dd7fSTimo Kreuzer { \
198*3a61dd7fSTimo Kreuzer     type ## _cxx_type_info.type_info  = (char *)&type ## _type_info - base; \
199*3a61dd7fSTimo Kreuzer     type ## _cxx_type_info.copy_ctor  = (char *)type ## _copy_ctor - base; \
200*3a61dd7fSTimo Kreuzer }
201*3a61dd7fSTimo Kreuzer 
202*3a61dd7fSTimo Kreuzer #define DEFINE_CXX_EXCEPTION(type, base_no, cl1, cl2, dtor)  \
203*3a61dd7fSTimo Kreuzer static cxx_type_info_table type ## _cxx_type_table = { \
2049efafd64STimo Kreuzer     base_no+1, \
2059efafd64STimo Kreuzer     { \
2069efafd64STimo Kreuzer         0xdeadbeef, \
2079efafd64STimo Kreuzer         0xdeadbeef, \
208*3a61dd7fSTimo Kreuzer         0xdeadbeef, \
2099efafd64STimo Kreuzer     } \
2109efafd64STimo Kreuzer }; \
2119efafd64STimo Kreuzer \
2129efafd64STimo Kreuzer static cxx_exception_type type ##_exception_type = { \
2139efafd64STimo Kreuzer     0, \
2149efafd64STimo Kreuzer     0xdeadbeef, \
2159efafd64STimo Kreuzer     0, \
2169efafd64STimo Kreuzer     0xdeadbeef \
2179efafd64STimo Kreuzer }; \
2189efafd64STimo Kreuzer \
2199efafd64STimo Kreuzer static void init_ ## type ## _cxx(char *base) \
2209efafd64STimo Kreuzer { \
221*3a61dd7fSTimo Kreuzer     init_ ## type ## _cxx_type_info(base); \
222*3a61dd7fSTimo Kreuzer     type ## _cxx_type_table.info[0]   = (char *)&type ## _cxx_type_info - base; \
223*3a61dd7fSTimo Kreuzer     type ## _cxx_type_table.info[1]   = (char *)cl1 - base; \
224*3a61dd7fSTimo Kreuzer     type ## _cxx_type_table.info[2]   = (char *)cl2 - base; \
225*3a61dd7fSTimo Kreuzer     type ## _exception_type.destructor      = (char *)dtor - base; \
226*3a61dd7fSTimo Kreuzer     type ## _exception_type.type_info_table = (char *)&type ## _cxx_type_table - base; \
2279efafd64STimo Kreuzer }
228*3a61dd7fSTimo Kreuzer 
2299efafd64STimo Kreuzer #endif
2309efafd64STimo Kreuzer 
231*3a61dd7fSTimo Kreuzer #define DEFINE_CXX_DATA(type, base_no, cl1, cl2, dtor) \
232*3a61dd7fSTimo Kreuzer DEFINE_CXX_TYPE_INFO(type) \
233*3a61dd7fSTimo Kreuzer DEFINE_CXX_EXCEPTION(type, base_no, cl1, cl2, dtor)
234*3a61dd7fSTimo Kreuzer 
235*3a61dd7fSTimo Kreuzer #define DEFINE_CXX_EXCEPTION0(name, dtor) \
236*3a61dd7fSTimo Kreuzer     DEFINE_CXX_EXCEPTION(name, 0, NULL, NULL, dtor)
237*3a61dd7fSTimo Kreuzer 
238*3a61dd7fSTimo Kreuzer #define DEFINE_CXX_DATA0(name, dtor) \
239*3a61dd7fSTimo Kreuzer     DEFINE_CXX_DATA(name, 0, NULL, NULL, dtor)
240*3a61dd7fSTimo Kreuzer #define DEFINE_CXX_DATA1(name, cl1, dtor) \
241*3a61dd7fSTimo Kreuzer     DEFINE_CXX_DATA(name, 1, cl1, NULL, dtor)
242*3a61dd7fSTimo Kreuzer #define DEFINE_CXX_DATA2(name, cl1, cl2, dtor) \
243*3a61dd7fSTimo Kreuzer     DEFINE_CXX_DATA(name, 2, cl1, cl2, dtor)
244*3a61dd7fSTimo Kreuzer 
245*3a61dd7fSTimo Kreuzer #if _MSVCR_VER >= 80
246*3a61dd7fSTimo Kreuzer #define EXCEPTION_MANGLED_NAME ".?AVexception@std@@"
247*3a61dd7fSTimo Kreuzer #else
248*3a61dd7fSTimo Kreuzer #define EXCEPTION_MANGLED_NAME ".?AVexception@@"
249*3a61dd7fSTimo Kreuzer #endif
250*3a61dd7fSTimo Kreuzer 
251*3a61dd7fSTimo Kreuzer #define CREATE_EXCEPTION_OBJECT(exception_name) \
252*3a61dd7fSTimo Kreuzer static exception* __exception_ctor(exception *this, const char *str, const vtable_ptr *vtbl) \
253*3a61dd7fSTimo Kreuzer { \
254*3a61dd7fSTimo Kreuzer     if (str) \
255*3a61dd7fSTimo Kreuzer     { \
256*3a61dd7fSTimo Kreuzer         unsigned int len = strlen(str) + 1; \
257*3a61dd7fSTimo Kreuzer         this->name = malloc(len); \
258*3a61dd7fSTimo Kreuzer         memcpy(this->name, str, len); \
259*3a61dd7fSTimo Kreuzer         this->do_free = TRUE; \
260*3a61dd7fSTimo Kreuzer     } \
261*3a61dd7fSTimo Kreuzer     else \
262*3a61dd7fSTimo Kreuzer     { \
263*3a61dd7fSTimo Kreuzer         this->name = NULL; \
264*3a61dd7fSTimo Kreuzer         this->do_free = FALSE; \
265*3a61dd7fSTimo Kreuzer     } \
266*3a61dd7fSTimo Kreuzer     this->vtable = vtbl; \
267*3a61dd7fSTimo Kreuzer     return this; \
268*3a61dd7fSTimo Kreuzer } \
269*3a61dd7fSTimo Kreuzer \
270*3a61dd7fSTimo Kreuzer static exception* __exception_copy_ctor(exception *this, const exception *rhs, const vtable_ptr *vtbl) \
271*3a61dd7fSTimo Kreuzer { \
272*3a61dd7fSTimo Kreuzer     if (rhs->do_free) \
273*3a61dd7fSTimo Kreuzer     { \
274*3a61dd7fSTimo Kreuzer         __exception_ctor(this, rhs->name, vtbl); \
275*3a61dd7fSTimo Kreuzer     } \
276*3a61dd7fSTimo Kreuzer     else \
277*3a61dd7fSTimo Kreuzer     { \
278*3a61dd7fSTimo Kreuzer         *this = *rhs; \
279*3a61dd7fSTimo Kreuzer         this->vtable = vtbl; \
280*3a61dd7fSTimo Kreuzer     } \
281*3a61dd7fSTimo Kreuzer     return this; \
282*3a61dd7fSTimo Kreuzer } \
283*3a61dd7fSTimo Kreuzer extern const vtable_ptr exception_name ## _vtable; \
284*3a61dd7fSTimo Kreuzer exception* __thiscall exception_name ## _copy_ctor(exception *this, const exception *rhs); \
285*3a61dd7fSTimo Kreuzer DEFINE_THISCALL_WRAPPER(exception_name ## _copy_ctor,8) \
286*3a61dd7fSTimo Kreuzer exception* __thiscall exception_name ## _copy_ctor(exception *this, const exception *rhs) \
287*3a61dd7fSTimo Kreuzer { \
288*3a61dd7fSTimo Kreuzer     return __exception_copy_ctor(this, rhs, & exception_name ## _vtable); \
289*3a61dd7fSTimo Kreuzer } \
290*3a61dd7fSTimo Kreuzer \
291*3a61dd7fSTimo Kreuzer void __thiscall exception_name ## _dtor(exception *this); \
292*3a61dd7fSTimo Kreuzer DEFINE_THISCALL_WRAPPER(exception_name ## _dtor,4) \
293*3a61dd7fSTimo Kreuzer void __thiscall exception_name ## _dtor(exception *this) \
294*3a61dd7fSTimo Kreuzer { \
295*3a61dd7fSTimo Kreuzer     if (this->do_free) free(this->name); \
296*3a61dd7fSTimo Kreuzer } \
297*3a61dd7fSTimo Kreuzer \
298*3a61dd7fSTimo Kreuzer void* __thiscall exception_name ## _vector_dtor(exception *this, unsigned int flags); \
299*3a61dd7fSTimo Kreuzer DEFINE_THISCALL_WRAPPER(exception_name ## _vector_dtor,8) \
300*3a61dd7fSTimo Kreuzer void* __thiscall exception_name ## _vector_dtor(exception *this, unsigned int flags) \
301*3a61dd7fSTimo Kreuzer { \
302*3a61dd7fSTimo Kreuzer     if (flags & 2) \
303*3a61dd7fSTimo Kreuzer     { \
304*3a61dd7fSTimo Kreuzer         INT_PTR i, *ptr = (INT_PTR *)this - 1; \
305*3a61dd7fSTimo Kreuzer \
306*3a61dd7fSTimo Kreuzer         for (i = *ptr - 1; i >= 0; i--) exception_name ## _dtor(this + i); \
307*3a61dd7fSTimo Kreuzer         operator_delete(ptr); \
308*3a61dd7fSTimo Kreuzer     } \
309*3a61dd7fSTimo Kreuzer     else \
310*3a61dd7fSTimo Kreuzer     { \
311*3a61dd7fSTimo Kreuzer         exception_name ## _dtor(this); \
312*3a61dd7fSTimo Kreuzer         if (flags & 1) operator_delete(this); \
313*3a61dd7fSTimo Kreuzer     } \
314*3a61dd7fSTimo Kreuzer     return this; \
315*3a61dd7fSTimo Kreuzer } \
316*3a61dd7fSTimo Kreuzer \
317*3a61dd7fSTimo Kreuzer const char* __thiscall exception_name ## _what(exception *this); \
318*3a61dd7fSTimo Kreuzer DEFINE_THISCALL_WRAPPER(exception_name ## _what,4) \
319*3a61dd7fSTimo Kreuzer const char* __thiscall exception_name ## _what(exception *this) \
320*3a61dd7fSTimo Kreuzer { \
321*3a61dd7fSTimo Kreuzer     return this->name ? this->name : "Unknown exception"; \
322*3a61dd7fSTimo Kreuzer } \
323*3a61dd7fSTimo Kreuzer \
324*3a61dd7fSTimo Kreuzer __ASM_BLOCK_BEGIN(exception_name ## _vtables) \
325*3a61dd7fSTimo Kreuzer __ASM_VTABLE(exception_name, \
326*3a61dd7fSTimo Kreuzer         VTABLE_ADD_FUNC(exception_name ## _vector_dtor) \
327*3a61dd7fSTimo Kreuzer         VTABLE_ADD_FUNC(exception_name ## _what)); \
328*3a61dd7fSTimo Kreuzer __ASM_BLOCK_END \
329*3a61dd7fSTimo Kreuzer \
330*3a61dd7fSTimo Kreuzer DEFINE_RTTI_DATA0(exception_name, 0, EXCEPTION_MANGLED_NAME) \
331*3a61dd7fSTimo Kreuzer DEFINE_CXX_TYPE_INFO(exception_name)
332*3a61dd7fSTimo Kreuzer 
3339efafd64STimo Kreuzer #endif /* __MSVCRT_CPPEXCEPT_H */
334