ReactOS 0.4.15-dev-7918-g2a2556c
cpp.c
Go to the documentation of this file.
1/* Unit test suite for msvcrt C++ objects
2 *
3 * Copyright 2003 Jon Griffiths
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 */
19#include "wine/test.h"
20#include "winbase.h"
21#include "winnt.h"
22
23typedef void (*vtable_ptr)(void);
24
25typedef struct __exception
26{
28 char *name;
31
32typedef struct __type_info
33{
35 char *name;
36 char mangled[16];
38
39#undef __thiscall
40#ifdef __i386__
41#define __thiscall __stdcall
42#else
43#define __thiscall __cdecl
44#endif
45
46/* Function pointers. We need to use these to call these funcs as __thiscall */
48
49static void* (__cdecl *poperator_new)(unsigned int);
50static void (__cdecl *poperator_delete)(void*);
51static void* (__cdecl *pmalloc)(unsigned int);
52static void (__cdecl *pfree)(void*);
53
54/* exception */
55static void (__thiscall *pexception_ctor)(exception*,LPCSTR*);
56static void (__thiscall *pexception_copy_ctor)(exception*,exception*);
57static void (__thiscall *pexception_default_ctor)(exception*);
58static void (__thiscall *pexception_dtor)(exception*);
62static void (__thiscall *pexception_vector_dtor)(exception*,unsigned int);
63static void (__thiscall *pexception_scalar_dtor)(exception*,unsigned int);
64
65/* bad_typeid */
66static void (__thiscall *pbad_typeid_ctor)(exception*,LPCSTR);
67static void (__thiscall *pbad_typeid_ctor_closure)(exception*);
68static void (__thiscall *pbad_typeid_copy_ctor)(exception*,exception*);
69static void (__thiscall *pbad_typeid_dtor)(exception*);
73static void (__thiscall *pbad_typeid_vector_dtor)(exception*,unsigned int);
74static void (__thiscall *pbad_typeid_scalar_dtor)(exception*,unsigned int);
75
76/* bad_cast */
77static void (__thiscall *pbad_cast_ctor)(exception*,LPCSTR*);
78static void (__thiscall *pbad_cast_ctor2)(exception*,LPCSTR);
79static void (__thiscall *pbad_cast_ctor_closure)(exception*);
80static void (__thiscall *pbad_cast_copy_ctor)(exception*,exception*);
81static void (__thiscall *pbad_cast_dtor)(exception*);
85static void (__thiscall *pbad_cast_vector_dtor)(exception*,unsigned int);
86static void (__thiscall *pbad_cast_scalar_dtor)(exception*,unsigned int);
87
88/* __non_rtti_object */
89static void (__thiscall *p__non_rtti_object_ctor)(exception*,LPCSTR);
90static void (__thiscall *p__non_rtti_object_copy_ctor)(exception*,exception*);
91static void (__thiscall *p__non_rtti_object_dtor)(exception*);
95static void (__thiscall *p__non_rtti_object_vector_dtor)(exception*,unsigned int);
96static void (__thiscall *p__non_rtti_object_scalar_dtor)(exception*,unsigned int);
97
98/* type_info */
99static void (__thiscall *ptype_info_dtor)(type_info*);
102static int (__thiscall *ptype_info_before)(type_info*,type_info*);
103static int (__thiscall *ptype_info_opequals_equals)(type_info*,type_info*);
104static int (__thiscall *ptype_info_opnot_equals)(type_info*,type_info*);
105
106/* RTTI */
107static type_info* (__cdecl *p__RTtypeid)(void*);
108static void* (__cdecl *p__RTCastToVoid)(void*);
109static void* (__cdecl *p__RTDynamicCast)(void*,int,void*,void*,int);
110
111/*Demangle*/
112static char* (__cdecl *p__unDName)(char*,const char*,int,void*,void*,unsigned short int);
113
114
115/* _very_ early native versions have serious RTTI bugs, so we check */
116static void* bAncientVersion;
117
118/* Emulate a __thiscall */
119#ifdef __i386__
120
121#include "pshpack1.h"
122struct thiscall_thunk
123{
124 BYTE pop_eax; /* popl %eax (ret addr) */
125 BYTE pop_edx; /* popl %edx (func) */
126 BYTE pop_ecx; /* popl %ecx (this) */
127 BYTE push_eax; /* pushl %eax */
128 WORD jmp_edx; /* jmp *%edx */
129};
130#include "poppack.h"
131
132static void * (WINAPI *call_thiscall_func1)( void *func, void *this );
133static void * (WINAPI *call_thiscall_func2)( void *func, void *this, const void *a );
134
135static void init_thiscall_thunk(void)
136{
137 struct thiscall_thunk *thunk = VirtualAlloc( NULL, sizeof(*thunk),
139 thunk->pop_eax = 0x58; /* popl %eax */
140 thunk->pop_edx = 0x5a; /* popl %edx */
141 thunk->pop_ecx = 0x59; /* popl %ecx */
142 thunk->push_eax = 0x50; /* pushl %eax */
143 thunk->jmp_edx = 0xe2ff; /* jmp *%edx */
144 call_thiscall_func1 = (void *)thunk;
145 call_thiscall_func2 = (void *)thunk;
146}
147
148#define call_func1(func,_this) call_thiscall_func1(func,_this)
149#define call_func2(func,_this,a) call_thiscall_func2(func,_this,(const void*)(a))
150
151#else
152
153#define init_thiscall_thunk() do { } while(0)
154#define call_func1(func,_this) func(_this)
155#define call_func2(func,_this,a) func(_this,a)
156
157#endif /* __i386__ */
158
159/* Some exports are only available in later versions */
160#define SETNOFAIL(x,y) x = (void*)GetProcAddress(hMsvcrt,y)
161#define SET(x,y) do { SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y); } while(0)
162
164{
165 hMsvcrt = GetModuleHandleA("msvcrt.dll");
166 if (!hMsvcrt)
167 hMsvcrt = GetModuleHandleA("msvcrtd.dll");
168 ok(hMsvcrt != 0, "GetModuleHandleA failed\n");
169 if (!hMsvcrt)
170 {
171 win_skip("Could not load msvcrt.dll\n");
172 return FALSE;
173 }
174
175 SET(pmalloc, "malloc");
176 SET(pfree, "free");
177
178 SET(pexception_vtable, "??_7exception@@6B@");
179 SET(pbad_typeid_vtable, "??_7bad_typeid@@6B@");
180 SET(pbad_cast_vtable, "??_7bad_cast@@6B@");
181 SET(p__non_rtti_object_vtable, "??_7__non_rtti_object@@6B@");
182
183 SET(p__RTtypeid, "__RTtypeid");
184 SET(p__RTCastToVoid, "__RTCastToVoid");
185 SET(p__RTDynamicCast, "__RTDynamicCast");
186
187 SET(p__unDName,"__unDName");
188
189 /* Extremely early versions export logic_error, and crash in RTTI */
190 SETNOFAIL(bAncientVersion, "??0logic_error@@QAE@ABQBD@Z");
191 if (sizeof(void *) > sizeof(int)) /* 64-bit initialization */
192 {
193 SETNOFAIL(poperator_new, "??_U@YAPEAX_K@Z");
194 SETNOFAIL(poperator_delete, "??_V@YAXPEAX@Z");
195
196 SET(pexception_ctor, "??0exception@@QEAA@AEBQEBD@Z");
197 SET(pexception_copy_ctor, "??0exception@@QEAA@AEBV0@@Z");
198 SET(pexception_default_ctor, "??0exception@@QEAA@XZ");
199 SET(pexception_dtor, "??1exception@@UEAA@XZ");
200 SET(pexception_opequals, "??4exception@@QEAAAEAV0@AEBV0@@Z");
201 SET(pexception_what, "?what@exception@@UEBAPEBDXZ");
202 pexception_vector_dtor = (void*)pexception_vtable[0];
203 pexception_scalar_dtor = (void*)pexception_vtable[0];
204
205 SET(pbad_typeid_ctor, "??0bad_typeid@@QEAA@PEBD@Z");
206 SETNOFAIL(pbad_typeid_ctor_closure, "??_Fbad_typeid@@QEAAXXZ");
207 SET(pbad_typeid_copy_ctor, "??0bad_typeid@@QEAA@AEBV0@@Z");
208 SET(pbad_typeid_dtor, "??1bad_typeid@@UEAA@XZ");
209 SET(pbad_typeid_opequals, "??4bad_typeid@@QEAAAEAV0@AEBV0@@Z");
210 SET(pbad_typeid_what, "?what@exception@@UEBAPEBDXZ");
211 pbad_typeid_vector_dtor = (void*)pbad_typeid_vtable[0];
212 pbad_typeid_scalar_dtor = (void*)pbad_typeid_vtable[0];
213
214 SET(pbad_cast_ctor, "??0bad_cast@@QEAA@AEBQEBD@Z");
215 SET(pbad_cast_ctor2, "??0bad_cast@@QEAA@PEBD@Z");
216 SET(pbad_cast_ctor_closure, "??_Fbad_cast@@QEAAXXZ");
217 SET(pbad_cast_copy_ctor, "??0bad_cast@@QEAA@AEBV0@@Z");
218 SET(pbad_cast_dtor, "??1bad_cast@@UEAA@XZ");
219 SET(pbad_cast_opequals, "??4bad_cast@@QEAAAEAV0@AEBV0@@Z");
220 SET(pbad_cast_what, "?what@exception@@UEBAPEBDXZ");
221 pbad_cast_vector_dtor = (void*)pbad_cast_vtable[0];
222 pbad_cast_scalar_dtor = (void*)pbad_cast_vtable[0];
223
224 SET(p__non_rtti_object_ctor, "??0__non_rtti_object@@QEAA@PEBD@Z");
225 SET(p__non_rtti_object_copy_ctor, "??0__non_rtti_object@@QEAA@AEBV0@@Z");
226 SET(p__non_rtti_object_dtor, "??1__non_rtti_object@@UEAA@XZ");
227 SET(p__non_rtti_object_opequals, "??4__non_rtti_object@@QEAAAEAV0@AEBV0@@Z");
228 SET(p__non_rtti_object_what, "?what@exception@@UEBAPEBDXZ");
229 p__non_rtti_object_vector_dtor = (void*)p__non_rtti_object_vtable[0];
230 p__non_rtti_object_scalar_dtor = (void*)p__non_rtti_object_vtable[0];
231
232 SET(ptype_info_dtor, "??1type_info@@UEAA@XZ");
233 SET(ptype_info_raw_name, "?raw_name@type_info@@QEBAPEBDXZ");
234 SET(ptype_info_name, "?name@type_info@@QEBAPEBDXZ");
235 SET(ptype_info_before, "?before@type_info@@QEBAHAEBV1@@Z");
236 SET(ptype_info_opequals_equals, "??8type_info@@QEBAHAEBV0@@Z");
237 SET(ptype_info_opnot_equals, "??9type_info@@QEBAHAEBV0@@Z");
238 }
239 else
240 {
241#ifdef __arm__
242 SETNOFAIL(poperator_new, "??_U@YAPAXI@Z");
243 SETNOFAIL(poperator_delete, "??_V@YAXPAX@Z");
244
245 SET(pexception_ctor, "??0exception@std@@QAA@ABQBD@Z");
246 SET(pexception_copy_ctor, "??0exception@std@@QAA@ABV01@@Z");
247 SET(pexception_default_ctor, "??0exception@std@@QAA@XZ");
248 SET(pexception_dtor, "??1exception@std@@UAA@XZ");
249 SET(pexception_opequals, "??4exception@std@@QAAAAV01@ABV01@@Z");
250 SET(pexception_what, "?what@exception@std@@UBAPBDXZ");
251 SET(pexception_vector_dtor, "??_Eexception@@UAEPAXI@Z");
252 SET(pexception_scalar_dtor, "??_Gexception@@UAEPAXI@Z");
253
254 SET(pbad_typeid_ctor, "??0bad_typeid@std@@QAA@PBD@Z");
255 SETNOFAIL(pbad_typeid_ctor_closure, "??_Fbad_typeid@std@@QAAXXZ");
256 SET(pbad_typeid_copy_ctor, "??0bad_typeid@std@@QAA@ABV01@@Z");
257 SET(pbad_typeid_dtor, "??1bad_typeid@std@@UAA@XZ");
258 SET(pbad_typeid_opequals, "??4bad_typeid@std@@QAAAAV01@ABV01@@Z");
259 SET(pbad_typeid_what, "?what@exception@std@@UBAPBDXZ");
260 SET(pbad_typeid_vector_dtor, "??_Ebad_cast@@UAEPAXI@Z");
261 SET(pbad_typeid_scalar_dtor, "??_Gbad_cast@@UAEPAXI@Z");
262
263 SETNOFAIL(pbad_cast_ctor, "??0bad_cast@@QAE@ABQBD@Z");
264 if (!pbad_cast_ctor)
265 SET(pbad_cast_ctor, "??0bad_cast@std@@AAA@PBQBD@Z");
266 SETNOFAIL(pbad_cast_ctor2, "??0bad_cast@std@@QAA@PBD@Z");
267 SETNOFAIL(pbad_cast_ctor_closure, "??_Fbad_cast@std@@QAAXXZ");
268 /* FIXME: No ARM equivalent for "??0bad_cast@@QAE@ABV0@@Z" */
269 SET(pbad_cast_dtor, "??1bad_cast@std@@UAA@XZ");
270 SET(pbad_cast_opequals, "??4bad_cast@std@@QAAAAV01@ABV01@@Z");
271 SET(pbad_cast_what, "?what@exception@std@@UBAPBDXZ");
272 SET(pbad_cast_vector_dtor, "??_Ebad_cast@@UAEPAXI@Z");
273 SET(pbad_cast_scalar_dtor, "??_Gbad_cast@@UAEPAXI@Z");
274
275 SET(p__non_rtti_object_ctor, "??0__non_rtti_object@std@@QAA@PBD@Z");
276 SET(p__non_rtti_object_copy_ctor, "??0__non_rtti_object@std@@QAA@ABV01@@Z");
277 SET(p__non_rtti_object_dtor, "??1__non_rtti_object@std@@UAA@XZ");
278 SET(p__non_rtti_object_opequals, "??4__non_rtti_object@std@@QAAAAV01@ABV01@@Z");
279 SET(p__non_rtti_object_what, "?what@exception@std@@UBAPBDXZ");
280 SET(p__non_rtti_object_vector_dtor, "??_E__non_rtti_object@@UAEPAXI@Z");
281 SET(p__non_rtti_object_scalar_dtor, "??_G__non_rtti_object@@UAEPAXI@Z");
282
283 SET(ptype_info_dtor, "??1type_info@@UAA@XZ");
284 SET(ptype_info_raw_name, "?raw_name@type_info@@QBAPBDXZ");
285 SET(ptype_info_name, "?name@type_info@@QBEPBDXZ");
286 SET(ptype_info_before, "?before@type_info@@QBA_NABV1@@Z");
287 SET(ptype_info_opequals_equals, "??8type_info@@QBA_NABV0@@Z");
288 SET(ptype_info_opnot_equals, "??9type_info@@QBA_NABV0@@Z");
289#else
290 SETNOFAIL(poperator_new, "??_U@YAPAXI@Z");
291 SETNOFAIL(poperator_delete, "??_V@YAXPAX@Z");
292
293 SET(pexception_ctor, "??0exception@@QAE@ABQBD@Z");
294 SET(pexception_copy_ctor, "??0exception@@QAE@ABV0@@Z");
295 SET(pexception_default_ctor, "??0exception@@QAE@XZ");
296 SET(pexception_dtor, "??1exception@@UAE@XZ");
297 SET(pexception_opequals, "??4exception@@QAEAAV0@ABV0@@Z");
298 SET(pexception_what, "?what@exception@@UBEPBDXZ");
299 SET(pexception_vector_dtor, "??_Eexception@@UAEPAXI@Z");
300 SET(pexception_scalar_dtor, "??_Gexception@@UAEPAXI@Z");
301
302 SET(pbad_typeid_ctor, "??0bad_typeid@@QAE@PBD@Z");
303 SETNOFAIL(pbad_typeid_ctor_closure, "??_Fbad_typeid@@QAEXXZ");
304 SET(pbad_typeid_copy_ctor, "??0bad_typeid@@QAE@ABV0@@Z");
305 SET(pbad_typeid_dtor, "??1bad_typeid@@UAE@XZ");
306 SET(pbad_typeid_opequals, "??4bad_typeid@@QAEAAV0@ABV0@@Z");
307 SET(pbad_typeid_what, "?what@exception@@UBEPBDXZ");
308 SET(pbad_typeid_vector_dtor, "??_Ebad_typeid@@UAEPAXI@Z");
309 SET(pbad_typeid_scalar_dtor, "??_Gbad_typeid@@UAEPAXI@Z");
310
311 SETNOFAIL(pbad_cast_ctor, "??0bad_cast@@QAE@ABQBD@Z");
312 if (!pbad_cast_ctor)
313 SET(pbad_cast_ctor, "??0bad_cast@@AAE@PBQBD@Z");
314 SETNOFAIL(pbad_cast_ctor2, "??0bad_cast@@QAE@PBD@Z");
315 SETNOFAIL(pbad_cast_ctor_closure, "??_Fbad_cast@@QAEXXZ");
316 SET(pbad_cast_copy_ctor, "??0bad_cast@@QAE@ABV0@@Z");
317 SET(pbad_cast_dtor, "??1bad_cast@@UAE@XZ");
318 SET(pbad_cast_opequals, "??4bad_cast@@QAEAAV0@ABV0@@Z");
319 SET(pbad_cast_what, "?what@exception@@UBEPBDXZ");
320 SET(pbad_cast_vector_dtor, "??_Ebad_cast@@UAEPAXI@Z");
321 SET(pbad_cast_scalar_dtor, "??_Gbad_cast@@UAEPAXI@Z");
322
323 SET(p__non_rtti_object_ctor, "??0__non_rtti_object@@QAE@PBD@Z");
324 SET(p__non_rtti_object_copy_ctor, "??0__non_rtti_object@@QAE@ABV0@@Z");
325 SET(p__non_rtti_object_dtor, "??1__non_rtti_object@@UAE@XZ");
326 SET(p__non_rtti_object_opequals, "??4__non_rtti_object@@QAEAAV0@ABV0@@Z");
327 SET(p__non_rtti_object_what, "?what@exception@@UBEPBDXZ");
328 SET(p__non_rtti_object_vector_dtor, "??_E__non_rtti_object@@UAEPAXI@Z");
329 SET(p__non_rtti_object_scalar_dtor, "??_G__non_rtti_object@@UAEPAXI@Z");
330
331 SET(ptype_info_dtor, "??1type_info@@UAE@XZ");
332 SET(ptype_info_raw_name, "?raw_name@type_info@@QBEPBDXZ");
333 SET(ptype_info_name, "?name@type_info@@QBEPBDXZ");
334 SET(ptype_info_before, "?before@type_info@@QBEHABV1@@Z");
335 SET(ptype_info_opequals_equals, "??8type_info@@QBEHABV0@@Z");
336 SET(ptype_info_opnot_equals, "??9type_info@@QBEHABV0@@Z");
337#endif /* __arm__ */
338 }
339
340 if (!poperator_new)
342 if (!poperator_delete)
343 poperator_delete = pfree;
344
346 return TRUE;
347}
348
349static void test_exception(void)
350{
351 static const char* e_name = "An exception name";
352 char* name;
353 exception e, e2, e3, *pe;
354
355 if (!poperator_new || !poperator_delete ||
356 !pexception_ctor || !pexception_copy_ctor || !pexception_default_ctor ||
357 !pexception_dtor || !pexception_opequals || !pexception_what ||
358 !pexception_vtable || !pexception_vector_dtor || !pexception_scalar_dtor)
359 return;
360
361 /* 'const char*&' ctor */
362 memset(&e, 0, sizeof(e));
363 call_func2(pexception_ctor, &e, &e_name);
364 ok(e.vtable != NULL, "Null exception vtable for e\n");
365 ok(e.name && e.name != e_name && !strcmp(e.name, "An exception name"), "Bad name '%s' for e\n", e.name);
366 ok(e.do_free == 1, "do_free set to %d for e\n", e.do_free);
367
368 /* Copy ctor */
369 memset(&e2, 0, sizeof(e2));
370 call_func2(pexception_copy_ctor, &e2, &e);
371 ok(e2.vtable != NULL, "Null exception vtable for e2\n");
372 ok(e2.name && e2.name != e.name && !strcmp(e2.name, "An exception name"), "Bad exception name for e2\n");
373 ok(e2.do_free == 1, "do_free set to %d for e2\n", e2.do_free);
374
375 /* Default ctor */
376 memset(&e3, 1, sizeof(e3));
377 call_func1(pexception_default_ctor, &e3);
378 ok(e3.vtable != NULL, "Null exception vtable for e3\n");
379 ok(e3.name == NULL, "Bad exception name for e3\n");
380 ok(e3.do_free == 0, "do_free set to %d for e3\n", e3.do_free);
381
382 ok(e.vtable == e2.vtable && e.vtable == e3.vtable, "exception vtables differ!\n");
383
384 /* Test calling the dtors */
385 call_func1(pexception_dtor, &e2);
386 call_func1(pexception_dtor, &e3);
387
388 /* Operator equals */
389 memset(&e2, 0, sizeof(e2));
390 call_func1(pexception_default_ctor, &e2);
391 pe = call_func2(pexception_opequals, &e2, &e);
392 ok(e2.vtable != NULL, "Null exception vtable for e2\n");
393 ok(e2.name && e2.name != e.name && !strcmp(e2.name, "An exception name"), "Bad exception name for e2\n");
394 ok(e2.do_free == 1, "do_free set to %d for e2\n", e2.do_free);
395 ok(pe == &e2, "opequals didn't return e2\n");
396
397 /* what() */
399 ok(e2.name == name, "Bad exception name from e2::what()\n");
400
401 /* vtable ptr */
402 ok(e2.vtable == pexception_vtable, "Bad vtable for e2\n");
403 call_func1(pexception_dtor, &e2);
404
405 /* new() */
406 pe = poperator_new(sizeof(exception));
407 ok(pe != NULL, "new() failed\n");
408 if (pe)
409 {
410 call_func2(pexception_ctor, pe, &e_name);
411 /* scalar dtor */
412 call_func2(pexception_scalar_dtor, pe, 0); /* Shouldn't delete pe */
413 pe->name = NULL;
414 pe->do_free = 0;
415 call_func2(pexception_scalar_dtor, pe, 1); /* Should delete pe */
416 }
417
418 pe = poperator_new(sizeof(exception));
419 ok(pe != NULL, "new() failed\n");
420 if (pe)
421 {
422 /* vector dtor, single element */
423 call_func2(pexception_ctor, pe, &e_name);
424 call_func2(pexception_vector_dtor, pe, 1); /* Should delete pe as single element*/
425 }
426
427 pe = poperator_new(sizeof(exception) * 4 + sizeof(size_t));
428 ok(pe != NULL, "new() failed\n");
429 if (pe)
430 {
431 /* vector dtor, multiple elements */
432 char name[] = "a constant";
433 *((size_t*)pe) = 3;
434 pe = (exception*)((size_t*)pe + 1);
435 call_func2(pexception_ctor, &pe[0], &e_name);
436 call_func2(pexception_ctor, &pe[1], &e_name);
437 call_func2(pexception_ctor, &pe[2], &e_name);
438 pe[3].name = name;
439 pe[3].do_free = 1; /* Crash if we try to free this */
440 call_func2(pexception_vector_dtor, pe, 3); /* Should delete all 3 and then pe block */
441 }
442
443 /* test our exported vtable is kosher */
444 pe = (void*)pexception_vtable; /* Use the exception struct to get vtable ptrs */
445 pexception_vector_dtor = (void*)pe->vtable;
446 pexception_what = (void*)pe->name;
447
449 ok(e.name == name, "Bad exception name from vtable e::what()\n");
450
452 {
453 /* Check the rtti */
454 type_info *ti = p__RTtypeid(&e);
455 ok (ti && !strcmp(ti->mangled, ".?AVexception@@"), "bad rtti for e\n");
456
457 if (ti)
458 {
459 /* Check the returned type_info has rtti too */
460 type_info *ti2 = p__RTtypeid(ti);
461 ok (ti2 != NULL && !strcmp(ti2->mangled, ".?AVtype_info@@"), "bad rtti for e's type_info\n");
462 }
463 }
464
465 call_func2(pexception_vector_dtor, &e, 0); /* Should delete e.name, but not e */
466}
467
468/* This test is basically a cut 'n' paste of the exception test. but it verifies that
469 * bad_typeid works the exact same way... */
470static void test_bad_typeid(void)
471{
472 static const char* e_name = "A bad_typeid name";
473 char* name;
474 exception e, e2, e3, *pe;
475
476 if (!poperator_new || !poperator_delete ||
477 !pbad_typeid_ctor || !pbad_typeid_copy_ctor ||
478 !pbad_typeid_dtor || !pbad_typeid_opequals || !pbad_typeid_what ||
479 !pbad_typeid_vtable || !pbad_typeid_vector_dtor || !pbad_typeid_scalar_dtor)
480 return;
481
482 /* 'const char*' ctor */
483 memset(&e, 0, sizeof(e));
484 call_func2(pbad_typeid_ctor, &e, e_name);
485 ok(e.vtable != NULL, "Null bad_typeid vtable for e\n");
486 ok(e.name && e.name != e_name && !strcmp(e.name, "A bad_typeid name"), "Bad name '%s' for e\n", e.name);
487 ok(e.do_free == 1, "do_free set to %d for e\n", e.do_free);
488
489 /* Copy ctor */
490 memset(&e2, 0, sizeof(e2));
491 call_func2(pbad_typeid_copy_ctor, &e2, &e);
492 ok(e2.vtable != NULL, "Null bad_typeid vtable for e2\n");
493 ok(e2.name && e2.name != e.name && !strcmp(e2.name, "A bad_typeid name"), "Bad name '%s' for e2\n", e2.name);
494 ok(e2.do_free == 1, "do_free set to %d for e2\n", e2.do_free);
495
496 /* Ctor closure */
497 if (pbad_typeid_ctor_closure)
498 {
499 memset(&e3, 1, sizeof(e3));
500 call_func1(pbad_typeid_ctor_closure, &e3);
501 ok(e3.vtable != NULL, "Null bad_typeid vtable for e3\n");
502 ok(e3.name && !strcmp(e3.name, "bad typeid"), "Bad bad_typeid name for e3\n");
503 ok(e3.do_free == 1, "do_free set to %d for e3\n", e3.do_free);
504 ok(e.vtable == e3.vtable, "bad_typeid closure vtables differ!\n");
505 call_func1(pbad_typeid_dtor, &e3);
506 }
507 ok(e.vtable == e2.vtable, "bad_typeid vtables differ!\n");
508
509 /* Test calling the dtors */
510 call_func1(pbad_typeid_dtor, &e2);
511
512 /* Operator equals */
513 memset(&e2, 1, sizeof(e2));
514 call_func1(pexception_default_ctor, &e2);
515 pe = call_func2(pbad_typeid_opequals, &e2, &e);
516 ok(e2.vtable != NULL, "Null bad_typeid vtable for e2\n");
517 ok(e2.name && e2.name != e.name && !strcmp(e2.name, "A bad_typeid name"), "Bad bad_typeid name for e2\n");
518 ok(e2.do_free == 1, "do_free set to %d for e2\n", e2.do_free);
519 ok(pe == &e2, "opequals didn't return e2\n");
520
521 /* what() */
523 ok(e2.name == name, "Bad bad_typeid name from e2::what()\n");
524
525 /* vtable ptr */
526 ok(e2.vtable == pexception_vtable, "Bad vtable for e2\n");
527 call_func1(pbad_typeid_dtor, &e2);
528
529 /* new() */
530 pe = poperator_new(sizeof(exception));
531 ok(pe != NULL, "new() failed\n");
532 if (pe)
533 {
534 call_func2(pbad_typeid_ctor, pe, e_name);
535 /* scalar dtor */
536 call_func2(pbad_typeid_scalar_dtor, pe, 0); /* Shouldn't delete pe */
537 pe->name = NULL;
538 pe->do_free = 0;
539 call_func2(pbad_typeid_scalar_dtor, pe, 1); /* Should delete pe */
540 }
541
542 pe = poperator_new(sizeof(exception));
543 ok(pe != NULL, "new() failed\n");
544 if (pe)
545 {
546 /* vector dtor, single element */
547 call_func2(pbad_typeid_ctor, pe, e_name);
548 call_func2(pbad_typeid_vector_dtor, pe, 1); /* Should delete pe as single element*/
549 }
550
551 pe = poperator_new(sizeof(exception) * 4 + sizeof(size_t));
552 ok(pe != NULL, "new() failed\n");
553 if (pe)
554 {
555 /* vector dtor, multiple elements */
556 *((size_t*)pe) = 3;
557 pe = (exception*)((size_t*)pe + 1);
558 call_func2(pbad_typeid_ctor, &pe[0], e_name);
559 call_func2(pbad_typeid_ctor, &pe[1], e_name);
560 call_func2(pbad_typeid_ctor, &pe[2], e_name);
561 pe[3].name = 0;
562 pe[3].do_free = 1; /* Crash if we try to free this element */
563 call_func2(pbad_typeid_vector_dtor, pe, 3); /* Should delete all 3 and then pe block */
564 }
565
566 /* test our exported vtable is kosher */
567 pe = (void*)pbad_typeid_vtable; /* Use the exception struct to get vtable ptrs */
568 pbad_typeid_vector_dtor = (void*)pe->vtable;
569 pbad_typeid_what = (void*)pe->name;
570
572 ok(e.name == name, "Bad bad_typeid name from vtable e::what()\n");
573
575 {
576 /* Check the rtti */
577 type_info *ti = p__RTtypeid(&e);
578 ok (ti != NULL && !strcmp(ti->mangled, ".?AVbad_typeid@@"), "bad rtti for e (%s)\n",
579 !ti ? "null" : ti->mangled);
580 }
581
582 call_func2(pbad_typeid_vector_dtor, &e, 0); /* Should delete e.name, but not e */
583}
584
585
586/* Ditto for this test... */
587static void test_bad_cast(void)
588{
589 static const char* e_name = "A bad_cast name";
590 char* name;
591 exception e, e2, e3, *pe;
592
593 if (!poperator_new || !poperator_delete ||
594 !pbad_cast_ctor || !pbad_cast_copy_ctor ||
595 !pbad_cast_dtor || !pbad_cast_opequals || !pbad_cast_what ||
596 !pbad_cast_vtable || !pbad_cast_vector_dtor || !pbad_cast_scalar_dtor)
597 return;
598
599 if (pbad_cast_ctor2)
600 {
601 /* 'const char*' ctor */
602 memset(&e, 0, sizeof(e));
603 call_func2(pbad_cast_ctor2, &e, e_name);
604 ok(e.vtable != NULL, "Null bad_cast vtable for e\n");
605 ok(e.name && e.name != e_name && !strcmp(e.name, "A bad_cast name"), "Bad name '%s' for e\n", e.name);
606 ok(e.do_free == 1, "do_free set to %d for e\n", e.do_free);
607 call_func1(pbad_cast_dtor, &e);
608 }
609
610 /* 'const char*&' ctor */
611 memset(&e, 0, sizeof(e));
612 call_func2(pbad_cast_ctor, &e, &e_name);
613 ok(e.vtable != NULL, "Null bad_cast vtable for e\n");
614 ok(e.name && e.name != e_name && !strcmp(e.name, "A bad_cast name"), "Bad name '%s' for e\n", e.name);
615 ok(e.do_free == 1, "do_free set to %d for e\n", e.do_free);
616
617 /* Copy ctor */
618 memset(&e2, 0, sizeof(e2));
619 call_func2(pbad_cast_copy_ctor, &e2, &e);
620 ok(e2.vtable != NULL, "Null bad_cast vtable for e2\n");
621 ok(e2.name && e2.name != e.name && !strcmp(e2.name, "A bad_cast name"), "Bad name '%s' for e2\n", e2.name);
622 ok(e2.do_free == 1, "do_free set to %d for e2\n", e2.do_free);
623
624 /* Ctor closure */
625 if (pbad_cast_ctor_closure)
626 {
627 memset(&e3, 1, sizeof(e3));
628 call_func1(pbad_cast_ctor_closure, &e3);
629 ok(e3.vtable != NULL, "Null bad_cast vtable for e3\n");
630 ok(e3.name && !strcmp(e3.name, "bad cast"), "Bad bad_cast name for e3\n");
631 ok(e3.do_free == 1, "do_free set to %d for e3\n", e3.do_free);
632 ok(e.vtable == e3.vtable, "bad_cast closure vtables differ!\n");
633 call_func1(pbad_cast_dtor, &e3);
634 }
635 ok(e.vtable == e2.vtable, "bad_cast vtables differ!\n");
636
637 /* Test calling the dtors */
638 call_func1(pbad_cast_dtor, &e2);
639
640 /* Operator equals */
641 memset(&e2, 1, sizeof(e2));
642 call_func1(pexception_default_ctor, &e2);
643 pe = call_func2(pbad_cast_opequals, &e2, &e);
644 ok(e2.vtable != NULL, "Null bad_cast vtable for e2\n");
645 ok(e2.name && e2.name != e.name && !strcmp(e2.name, "A bad_cast name"), "Bad bad_cast name for e2\n");
646 ok(e2.do_free == 1, "do_free set to %d for e2\n", e2.do_free);
647 ok(pe == &e2, "opequals didn't return e2\n");
648
649 /* what() */
651 ok(e2.name == name, "Bad bad_cast name from e2::what()\n");
652
653 /* vtable ptr */
654 ok(e2.vtable == pexception_vtable, "Bad vtable for e2\n");
655 call_func1(pbad_cast_dtor, &e2);
656
657 /* new() */
658 pe = poperator_new(sizeof(exception));
659 ok(pe != NULL, "new() failed\n");
660 if (pe)
661 {
662 call_func2(pbad_cast_ctor, pe, &e_name);
663 /* scalar dtor */
664 call_func2(pbad_cast_scalar_dtor, pe, 0); /* Shouldn't delete pe */
665 pe->name = NULL;
666 pe->do_free = 0;
667 call_func2(pbad_cast_scalar_dtor, pe, 1); /* Should delete pe */
668 }
669
670 pe = poperator_new(sizeof(exception));
671 ok(pe != NULL, "new() failed\n");
672 if (pe)
673 {
674 /* vector dtor, single element */
675 call_func2(pbad_cast_ctor, pe, &e_name);
676 call_func2(pbad_cast_vector_dtor, pe, 1); /* Should delete pe as single element*/
677 }
678
679 pe = poperator_new(sizeof(exception) * 4 + sizeof(size_t));
680 ok(pe != NULL, "new() failed\n");
681 if (pe)
682 {
683 /* vector dtor, multiple elements */
684 *((size_t*)pe) = 3;
685 pe = (exception*)((size_t*)pe + 1);
686 call_func2(pbad_cast_ctor, &pe[0], &e_name);
687 call_func2(pbad_cast_ctor, &pe[1], &e_name);
688 call_func2(pbad_cast_ctor, &pe[2], &e_name);
689 pe[3].name = 0;
690 pe[3].do_free = 1; /* Crash if we try to free this element */
691 call_func2(pbad_cast_vector_dtor, pe, 3); /* Should delete all 3 and then pe block */
692 }
693
694 /* test our exported vtable is kosher */
695 pe = (void*)pbad_cast_vtable; /* Use the exception struct to get vtable ptrs */
696 pbad_cast_vector_dtor = (void*)pe->vtable;
697 pbad_cast_what = (void*)pe->name;
698
700 ok(e.name == name, "Bad bad_cast name from vtable e::what()\n");
701
703 {
704 /* Check the rtti */
705 type_info *ti = p__RTtypeid(&e);
706 ok (ti != NULL && !strcmp(ti->mangled, ".?AVbad_cast@@"), "bad rtti for e\n");
707 }
708 call_func2(pbad_cast_vector_dtor, &e, 0); /* Should delete e.name, but not e */
709}
710
711/* ... and this one */
712static void test___non_rtti_object(void)
713{
714 static const char* e_name = "A __non_rtti_object name";
715 char* name;
716 exception e, e2, *pe;
717
718 if (!poperator_new || !poperator_delete ||
719 !p__non_rtti_object_ctor || !p__non_rtti_object_copy_ctor ||
720 !p__non_rtti_object_dtor || !p__non_rtti_object_opequals || !p__non_rtti_object_what ||
721 !p__non_rtti_object_vtable || !p__non_rtti_object_vector_dtor || !p__non_rtti_object_scalar_dtor)
722 return;
723
724 /* 'const char*' ctor */
725 memset(&e, 0, sizeof(e));
726 call_func2(p__non_rtti_object_ctor, &e, e_name);
727 ok(e.vtable != NULL, "Null __non_rtti_object vtable for e\n");
728 ok(e.name && e.name != e_name && !strcmp(e.name, "A __non_rtti_object name"), "Bad name '%s' for e\n", e.name);
729 ok(e.do_free == 1, "do_free set to %d for e\n", e.do_free);
730
731 /* Copy ctor */
732 memset(&e2, 0, sizeof(e2));
733 call_func2(p__non_rtti_object_copy_ctor, &e2, &e);
734 ok(e2.vtable != NULL, "Null __non_rtti_object vtable for e2\n");
735 ok(e2.name && e2.name != e.name && !strcmp(e2.name, "A __non_rtti_object name"), "Bad name '%s' for e2\n", e2.name);
736 ok(e2.do_free == 1, "do_free set to %d for e2\n", e2.do_free);
737 ok(e.vtable == e2.vtable, "__non_rtti_object vtables differ!\n");
738
739 /* Test calling the dtors */
740 call_func1(p__non_rtti_object_dtor, &e2);
741
742 /* Operator equals */
743 memset(&e2, 1, sizeof(e2));
744 call_func1(pexception_default_ctor, &e2);
746 ok(e2.vtable != NULL, "Null __non_rtti_object vtable for e2\n");
747 ok(e2.name && e2.name != e.name && !strcmp(e2.name, "A __non_rtti_object name"), "Bad __non_rtti_object name for e2\n");
748 ok(e2.do_free == 1, "do_free set to %d for e2\n", e2.do_free);
749 ok(pe == &e2, "opequals didn't return e2\n");
750
751 /* what() */
753 ok(e2.name == name, "Bad __non_rtti_object name from e2::what()\n");
754
755 /* vtable ptr */
756 ok(e2.vtable == pexception_vtable, "Bad vtable for e2\n");
757 call_func1(p__non_rtti_object_dtor, &e2);
758
759 /* new() */
760 pe = poperator_new(sizeof(exception));
761 ok(pe != NULL, "new() failed\n");
762 if (pe)
763 {
764 call_func2(p__non_rtti_object_ctor, pe, e_name);
765 /* scalar dtor */
766 call_func2(p__non_rtti_object_scalar_dtor, pe, 0); /* Shouldn't delete pe */
767 pe->name = NULL;
768 pe->do_free = 0;
769 call_func2(p__non_rtti_object_scalar_dtor, pe, 1); /* Should delete pe */
770 }
771
772 pe = poperator_new(sizeof(exception));
773 ok(pe != NULL, "new() failed\n");
774 if (pe)
775 {
776 /* vector dtor, single element */
777 call_func2(p__non_rtti_object_ctor, pe, e_name);
778 call_func2(p__non_rtti_object_vector_dtor, pe, 1); /* Should delete pe as single element*/
779 }
780
781 pe = poperator_new(sizeof(exception) * 4 + sizeof(size_t));
782 ok(pe != NULL, "new() failed\n");
783 if (pe)
784 {
785 /* vector dtor, multiple elements */
786 *((size_t*)pe) = 3;
787 pe = (exception*)((size_t*)pe + 1);
788 call_func2(p__non_rtti_object_ctor, &pe[0], e_name);
789 call_func2(p__non_rtti_object_ctor, &pe[1], e_name);
790 call_func2(p__non_rtti_object_ctor, &pe[2], e_name);
791 pe[3].name = 0;
792 pe[3].do_free = 1; /* Crash if we try to free this element */
793 call_func2(p__non_rtti_object_vector_dtor, pe, 3); /* Should delete all 3 and then pe block */
794 }
795
796 /* test our exported vtable is kosher */
797 pe = (void*)p__non_rtti_object_vtable; /* Use the exception struct to get vtable ptrs */
798 p__non_rtti_object_vector_dtor = (void*)pe->vtable;
799 p__non_rtti_object_what = (void*)pe->name;
800
802 ok(e.name == name, "Bad __non_rtti_object name from vtable e::what()\n");
803
805 {
806 /* Check the rtti */
807 type_info *ti = p__RTtypeid(&e);
808 ok (ti != NULL && !strcmp(ti->mangled, ".?AV__non_rtti_object@@"), "bad rtti for e\n");
809 }
810 call_func2(p__non_rtti_object_vector_dtor, &e, 0); /* Should delete e.name, but not e */
811}
812
813static void test_type_info(void)
814{
815 static type_info t1 = { NULL, NULL,{'.','?','A','V','t','e','s','t','1','@','@',0,0,0,0,0 } };
816 static type_info t1_1 = { NULL, NULL,{'?','?','A','V','t','e','s','t','1','@','@',0,0,0,0,0 } };
817 static type_info t2 = { NULL, NULL, {'.','?','A','V','t','e','s','t','2','@','@',0,0,0,0,0 } };
818 char* name;
819 int res;
820
821 if (!pmalloc || !pfree || !ptype_info_dtor || !ptype_info_raw_name ||
822 !ptype_info_name || !ptype_info_before ||
823 !ptype_info_opequals_equals || !ptype_info_opnot_equals)
824 return;
825
826 /* Test calling the dtors */
827 call_func1(ptype_info_dtor, &t1); /* No effect, since name is NULL */
828 t1.name = pmalloc(64);
829 strcpy(t1.name, "foo");
830 call_func1(ptype_info_dtor, &t1); /* Frees t1.name using 'free' */
831
832 /* raw_name */
833 t1.name = NULL;
835
836 /* FIXME: This fails on native; it shouldn't though - native bug?
837 * ok(name && !strcmp(name, t1.mangled), "bad raw_name '%s' for t1 (expected '%s')\n", name, t1.mangled);
838 */
839 ok(t1.name == NULL, "raw_name() set name for t1\n");
840
841 /* name */
842 t1.name = NULL;
844 ok(name && t1.name && !strcmp(name, t1.name), "bad name '%s' for t1\n", name);
845
846 ok(t1.name && !strcmp(t1.name, "class test1"), "demangled to '%s' for t1\n", t1.name);
847 call_func1(ptype_info_dtor, &t1);
848
849 /* before */
850 t1.name = NULL;
851 res = (int)call_func2(ptype_info_before, &t1, &t1);
852 ok(res == 0, "expected 0, got %d\n", res);
853 res = (int)call_func2(ptype_info_before, &t2, &t1);
854 ok(res == 0, "expected 0, got %d\n", res);
855 res = (int)call_func2(ptype_info_before, &t1, &t2);
856 ok(res == 1, "expected 1, got %d\n", res);
857 /* Doesn't check first char */
858 res = (int)call_func2(ptype_info_before, &t1, &t1_1);
859 ok(res == 0, "expected 0, got %d\n", res);
860
861 /* opequals_equals */
862 t1.name = NULL;
863 res = (int)call_func2(ptype_info_opequals_equals, &t1, &t1);
864 ok(res == 1, "expected 1, got %d\n", res);
865 res = (int)call_func2(ptype_info_opequals_equals, &t1, &t2);
866 ok(res == 0, "expected 0, got %d\n", res);
867 res = (int)call_func2(ptype_info_opequals_equals, &t2, &t1);
868 ok(res == 0, "expected 0, got %d\n", res);
869
870 /* opnot_equals */
871 t1.name = NULL;
872 res = (int)call_func2(ptype_info_opnot_equals, &t1, &t1);
873 ok(res == 0, "expected 0, got %d\n", res);
874 res = (int)call_func2(ptype_info_opnot_equals, &t1, &t2);
875 ok(res == 1, "expected 1, got %d\n", res);
876 res = (int)call_func2(ptype_info_opnot_equals, &t2, &t1);
877 ok(res == 1, "expected 1, got %d\n", res);
878}
879
880static inline vtable_ptr *get_vtable( void *obj )
881{
882 return *(vtable_ptr **)obj;
883}
884
885static inline void/*rtti_object_locator*/ *get_obj_locator( void *cppobj )
886{
887 const vtable_ptr *vtable = get_vtable( cppobj );
888 return (void *)vtable[-1];
889}
890
891#ifndef __x86_64__
892#define DEFINE_RTTI_REF(type, name) type *name
893#define RTTI_REF(instance, name) &instance.name
894#define RTTI_REF_SIG0(instance, name, base) RTTI_REF(instance, name)
895#else
896#define DEFINE_RTTI_REF(type, name) unsigned name
897#define RTTI_REF(instance, name) FIELD_OFFSET(struct rtti_data, name)
898#define RTTI_REF_SIG0(instance, name, base) ((char*)&instance.name-base)
899#endif
900/* Test RTTI functions */
901static void test_rtti(void)
902{
903 struct _object_locator
904 {
905 unsigned int signature;
906 int base_class_offset;
907 unsigned int flags;
908 DEFINE_RTTI_REF(type_info, type_descriptor);
909 DEFINE_RTTI_REF(struct _rtti_object_hierarchy, type_hierarchy);
910 DEFINE_RTTI_REF(void, object_locator);
911 } *obj_locator;
912
913 struct rtti_data
914 {
916
918 {
919 DEFINE_RTTI_REF(type_info, type_descriptor);
920 int num_base_classes;
921 struct {
922 int this_offset;
923 int vbase_descr;
924 int vbase_offset;
926 unsigned int attributes;
927 } base_descriptor[4];
928
929 struct _rtti_base_array {
930 DEFINE_RTTI_REF(struct _rtti_base_descriptor, bases[4]);
931 } base_array;
932
934 unsigned int signature;
935 unsigned int attributes;
936 int array_len;
937 DEFINE_RTTI_REF(struct _rtti_base_array, base_classes);
938 } object_hierarchy;
939
940 struct _object_locator object_locator;
941 } simple_class_rtti = {
942 { {NULL, NULL, "simple_class"} },
943 { {RTTI_REF(simple_class_rtti, type_info[0]), 0, {0, 0, 0}, 0} },
944 { {RTTI_REF(simple_class_rtti, base_descriptor[0])} },
945 {0, 0, 1, RTTI_REF(simple_class_rtti, base_array)},
946 {1, 0, 0, RTTI_REF(simple_class_rtti, type_info[0]), RTTI_REF(simple_class_rtti, object_hierarchy), RTTI_REF(simple_class_rtti, object_locator)}
947 }, child_class_rtti = {
948 { {NULL, NULL, "simple_class"}, {NULL, NULL, "child_class"} },
949 { {RTTI_REF(child_class_rtti, type_info[1]), 0, {4, -1, 0}, 0}, {RTTI_REF(child_class_rtti, type_info[0]), 0, {8, -1, 0}, 0} },
950 { {RTTI_REF(child_class_rtti, base_descriptor[0]), RTTI_REF(child_class_rtti, base_descriptor[1])} },
951 {0, 0, 2, RTTI_REF(child_class_rtti, base_array)},
952 {1, 0, 0, RTTI_REF(child_class_rtti, type_info[1]), RTTI_REF(child_class_rtti, object_hierarchy), RTTI_REF(child_class_rtti, object_locator)}
953 }, virtual_base_class_rtti = {
954 { {NULL, NULL, "simple_class"}, {NULL, NULL, "child_class"} },
955 { {RTTI_REF(virtual_base_class_rtti, type_info[1]), 0, {0x10, sizeof(void*), sizeof(int)}, 0}, {RTTI_REF(virtual_base_class_rtti, type_info[0]), 0, {8, -1, 0}, 0} },
956 { {RTTI_REF(virtual_base_class_rtti, base_descriptor[0]), RTTI_REF(virtual_base_class_rtti, base_descriptor[1])} },
957 {0, 0, 2, RTTI_REF(virtual_base_class_rtti, base_array)},
958 {1, 0, 0, RTTI_REF(virtual_base_class_rtti, type_info[1]), RTTI_REF(virtual_base_class_rtti, object_hierarchy), RTTI_REF(virtual_base_class_rtti, object_locator)}
959 };
960 static struct rtti_data simple_class_sig0_rtti, child_class_sig0_rtti;
961
962 void *simple_class_vtbl[2] = {&simple_class_rtti.object_locator};
963 void *simple_class = &simple_class_vtbl[1];
964 void *child_class_vtbl[2] = {&child_class_rtti.object_locator};
965 void *child_class = &child_class_vtbl[1];
966 void *simple_class_sig0_vtbl[2] = {&simple_class_sig0_rtti.object_locator};
967 void *simple_class_sig0 = &simple_class_sig0_vtbl[1];
968 void *child_class_sig0_vtbl[2] = {&child_class_sig0_rtti.object_locator};
969 void *child_class_sig0 = &child_class_sig0_vtbl[1];
970 void *virtual_base_class_vtbl[2] = {&virtual_base_class_rtti.object_locator};
971 int virtual_base_class_vbtbl[2] = {0, 0x100};
972 struct {
973 void *virtual_base[2];
974 char data[0x110-sizeof(void*)];
975 void *vbthis;
976 } virtual_base_class = { {&virtual_base_class_vtbl[1], virtual_base_class_vbtbl} };
977
978 static const char* e_name = "name";
979 type_info *ti,*bti;
980 exception e,b;
981 void *casted;
982 BOOL old_signature;
983#ifdef __x86_64__
984 char *base = (char*)GetModuleHandleW(NULL);
985#endif
986
987 if (bAncientVersion ||
988 !p__RTCastToVoid || !p__RTtypeid || !pexception_ctor || !pbad_typeid_ctor
989 || !p__RTDynamicCast || !pexception_dtor || !pbad_typeid_dtor)
990 return;
991
992 call_func2(pexception_ctor, &e, &e_name);
993 call_func2(pbad_typeid_ctor, &b, e_name);
994
995 obj_locator = get_obj_locator(&e);
996 if(obj_locator->signature!=1 && sizeof(void*)>sizeof(int))
997 old_signature = TRUE;
998 else
999 old_signature = FALSE;
1000
1001 /* dynamic_cast to void* */
1002 casted = p__RTCastToVoid(&e);
1003 ok (casted == (void*)&e, "failed cast to void\n");
1004
1005 /* dynamic_cast up */
1006 ti = p__RTtypeid(&e);
1007 bti = p__RTtypeid(&b);
1008
1009 casted = p__RTDynamicCast(&b, 0, NULL, ti, 0);
1010 if (casted)
1011 {
1012 /* New versions do not allow this conversion due to compiler changes */
1013 ok (casted == (void*)&b, "failed cast from bad_typeid to exception\n");
1014 }
1015
1016 /* dynamic_cast down */
1017 casted = p__RTDynamicCast(&e, 0, NULL, bti, 0);
1018 ok (casted == NULL, "Cast succeeded\n");
1019
1020 call_func1(pexception_dtor, &e);
1021 call_func1(pbad_typeid_dtor, &b);
1022
1023 simple_class_sig0_rtti = simple_class_rtti;
1024 simple_class_sig0_rtti.object_locator.signature = 0;
1025 simple_class_sig0_rtti.base_descriptor[0].type_descriptor = RTTI_REF_SIG0(simple_class_sig0_rtti, type_info[0], base);
1026 simple_class_sig0_rtti.base_array.bases[0] = RTTI_REF_SIG0(simple_class_sig0_rtti, base_descriptor[0], base);
1027 simple_class_sig0_rtti.object_hierarchy.base_classes = RTTI_REF_SIG0(simple_class_sig0_rtti, base_array, base);
1028 simple_class_sig0_rtti.object_locator.type_descriptor = RTTI_REF_SIG0(simple_class_sig0_rtti, type_info[0], base);
1029 simple_class_sig0_rtti.object_locator.type_hierarchy = RTTI_REF_SIG0(simple_class_sig0_rtti, object_hierarchy, base);
1030
1031 child_class_sig0_rtti = child_class_rtti;
1032 child_class_sig0_rtti.object_locator.signature = 0;
1033 child_class_sig0_rtti.base_descriptor[0].type_descriptor = RTTI_REF_SIG0(child_class_sig0_rtti, type_info[1], base);
1034 child_class_sig0_rtti.base_descriptor[1].type_descriptor = RTTI_REF_SIG0(child_class_sig0_rtti, type_info[0], base);
1035 child_class_sig0_rtti.base_array.bases[0] = RTTI_REF_SIG0(child_class_sig0_rtti, base_descriptor[0], base);
1036 child_class_sig0_rtti.base_array.bases[1] = RTTI_REF_SIG0(child_class_sig0_rtti, base_descriptor[1], base);
1037 child_class_sig0_rtti.object_hierarchy.base_classes = RTTI_REF_SIG0(child_class_sig0_rtti, base_array, base);
1038 child_class_sig0_rtti.object_locator.type_descriptor = RTTI_REF_SIG0(child_class_sig0_rtti, type_info[1], base);
1039 child_class_sig0_rtti.object_locator.type_hierarchy = RTTI_REF_SIG0(child_class_sig0_rtti, object_hierarchy, base);
1040
1041 ti = p__RTtypeid(&simple_class_sig0);
1042 ok (ti && !strcmp(ti->mangled, "simple_class"), "incorrect rtti data\n");
1043
1044 casted = p__RTCastToVoid(&simple_class_sig0);
1045 ok (casted == (void*)&simple_class_sig0, "failed cast to void\n");
1046
1047 ti = p__RTtypeid(&child_class_sig0);
1048 ok (ti && !strcmp(ti->mangled, "child_class"), "incorrect rtti data\n");
1049
1050 casted = p__RTCastToVoid(&child_class_sig0);
1051 ok (casted == (void*)&child_class_sig0, "failed cast to void\n");
1052
1053 casted = p__RTDynamicCast(&child_class_sig0, 0, NULL, simple_class_sig0_rtti.type_info, 0);
1054 if(casted)
1055 {
1056 ok (casted == (char*)&child_class_sig0+8, "failed cast to simple_class (%p %p)\n", casted, &child_class_sig0);
1057 }
1058
1059 casted = p__RTDynamicCast(&child_class_sig0, 0, &child_class_sig0_rtti.type_info[0], &child_class_sig0_rtti.type_info[1], 0);
1060 ok(casted == (char*)&child_class_sig0+4, "failed cast to child class (%p %p)\n", casted, &child_class_sig0);
1061
1062 if(old_signature) {
1063 skip("signature==1 is not supported\n");
1064 return;
1065 }
1066
1067 ti = p__RTtypeid(&simple_class);
1068 ok (ti && !strcmp(ti->mangled, "simple_class"), "incorrect rtti data\n");
1069
1070 casted = p__RTCastToVoid(&simple_class);
1071 ok (casted == (void*)&simple_class, "failed cast to void\n");
1072
1073 ti = p__RTtypeid(&child_class);
1074 ok (ti && !strcmp(ti->mangled, "child_class"), "incorrect rtti data\n");
1075
1076 casted = p__RTCastToVoid(&child_class);
1077 ok (casted == (void*)&child_class, "failed cast to void\n");
1078
1079 casted = p__RTDynamicCast(&child_class, 0, NULL, simple_class_rtti.type_info, 0);
1080 if(casted)
1081 {
1082 ok (casted == (char*)&child_class+8, "failed cast to simple_class (%p %p)\n", casted, &child_class);
1083 }
1084
1085 casted = p__RTDynamicCast(&child_class, 0, &child_class_rtti.type_info[0], &child_class_rtti.type_info[1], 0);
1086 ok(casted == (char*)&child_class+4, "failed cast to child class (%p %p)\n", casted, &child_class);
1087
1088 casted = p__RTDynamicCast(&virtual_base_class, 0, &virtual_base_class_rtti.type_info[0], &virtual_base_class_rtti.type_info[1], 0);
1089 ok(casted == &virtual_base_class.vbthis, "failed cast to child class (%p %p)\n", casted, &virtual_base_class);
1090}
1091
1096};
1097
1098static void test_demangle_datatype(void)
1099{
1100 char * name;
1101 struct _demangle demangle[]={
1102/* { "BlaBla"," ?? ::Bla", FALSE}, */
1103 { "ABVVec4@ref2@dice@@","class dice::ref2::Vec4 const &",TRUE},
1104 { "?AV?$CDB_GEN_BIG_ENUM_FLAG@W4CDB_WYSIWYG_BITS_ENUM@@$0H@@@", "class CDB_GEN_BIG_ENUM_FLAG<enum CDB_WYSIWYG_BITS_ENUM,7>", TRUE},
1105 { "?AV?$CDB_GEN_BIG_ENUM_FLAG@W4CDB_WYSIWYG_BITS_ENUM@@$0HO@@@", "class CDB_GEN_BIG_ENUM_FLAG<enum CDB_WYSIWYG_BITS_ENUM,126>",TRUE},
1106 { "?AV?$CDB_GEN_BIG_ENUM_FLAG@W4CDB_WYSIWYG_BITS_ENUM@@$0HOA@@@", "class CDB_GEN_BIG_ENUM_FLAG<enum CDB_WYSIWYG_BITS_ENUM,2016>",TRUE},
1107 { "?AV?$CDB_GEN_BIG_ENUM_FLAG@W4CDB_WYSIWYG_BITS_ENUM@@$0HOAA@@@", "class CDB_GEN_BIG_ENUM_FLAG<enum CDB_WYSIWYG_BITS_ENUM,32256>",TRUE},
1108 { "?AV?$CDB_GEN_BIG_ENUM_FLAG@W4CDB_WYSIWYG_BITS_ENUM@@$01@@@", "?AV?$CDB_GEN_BIG_ENUM_FLAG@W4CDB_WYSIWYG_BITS_ENUM@@$01@@@", FALSE},
1109/* { "?AV?$CDB_GEN_BIG_ENUM_FLAG@W4CDB_WYSIWYG_BITS_ENUM@@$011@@@", "?AV?$CDB_GEN_BIG_ENUM_FLAG@W4CDB_WYSIWYG_BITS_ENUM@@$011@@@",FALSE}, */
1110 };
1111 int i, num_test = ARRAY_SIZE(demangle);
1112
1113 for (i = 0; i < num_test; i++)
1114 {
1115 name = p__unDName(0, demangle[i].mangled, 0, pmalloc, pfree, 0x2800);
1116 todo_wine_if (!demangle[i].test_in_wine)
1117 ok(name != NULL && !strcmp(name,demangle[i].result), "Got name \"%s\" for %d\n", name, i);
1118 if(name)
1119 pfree(name);
1120 }
1121}
1122
1123/* Compare two strings treating multiple spaces (' ', ascii 0x20) in s2
1124 as single space. Needed for test_demangle as __unDName() returns sometimes
1125 two spaces instead of one in some older native msvcrt dlls. */
1126static int strcmp_space(const char *s1, const char *s2)
1127{
1128 const char* s2start = s2;
1129 do {
1130 while (*s1 == *s2 && *s1) {
1131 s1++;
1132 s2++;
1133 }
1134 if (*s2 == ' ' && s2 > s2start && *(s2 - 1) == ' ')
1135 s2++;
1136 else
1137 break;
1138 } while (*s1 && *s2);
1139 return *s1 - *s2;
1140}
1141
1142static void test_demangle(void)
1143{
1144 static struct {const char* in; const char* out; const char *broken; unsigned int flags;} test[] = {
1145/* 0 */ {"??0bad_alloc@std@@QAE@ABV01@@Z",
1146 "public: __thiscall std::bad_alloc::bad_alloc(class std::bad_alloc const &)",
1147 "public: __thiscall std::bad_alloc::bad_alloc(class bad_alloc::bad_alloc const &)"},
1148/* 1 */ {"??0bad_alloc@std@@QAE@PBD@Z",
1149 "public: __thiscall std::bad_alloc::bad_alloc(char const *)"},
1150/* 2 */ {"??0bad_cast@@AAE@PBQBD@Z",
1151 "private: __thiscall bad_cast::bad_cast(char const * const *)"},
1152/* 3 */ {"??0bad_cast@@QAE@ABQBD@Z",
1153 "public: __thiscall bad_cast::bad_cast(char const * const &)"},
1154/* 4 */ {"??0bad_cast@@QAE@ABV0@@Z",
1155 "public: __thiscall bad_cast::bad_cast(class bad_cast const &)"},
1156/* 5 */ {"??0bad_exception@std@@QAE@ABV01@@Z",
1157 "public: __thiscall std::bad_exception::bad_exception(class std::bad_exception const &)",
1158 "public: __thiscall std::bad_exception::bad_exception(class bad_exception::bad_exception const &)"},
1159/* 6 */ {"??0bad_exception@std@@QAE@PBD@Z",
1160 "public: __thiscall std::bad_exception::bad_exception(char const *)"},
1161/* 7 */ {"??0?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAE@ABV01@@Z",
1162 "public: __thiscall std::basic_filebuf<char,struct std::char_traits<char> >::basic_filebuf<char,struct std::char_traits<char> >(class std::basic_filebuf<char,struct std::char_traits<char> > const &)",
1163 "public: __thiscall std::basic_filebuf<char,struct std::char_traits<char> >::basic_filebuf<char,struct std::char_traits<char> >(class basic_filebuf<char,struct std::char_traits<char> >::basic_filebuf<char,struct std::char_traits<char> > const &)"},
1164/* 8 */ {"??0?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAE@PAU_iobuf@@@Z",
1165 "public: __thiscall std::basic_filebuf<char,struct std::char_traits<char> >::basic_filebuf<char,struct std::char_traits<char> >(struct _iobuf *)"},
1166/* 9 */ {"??0?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAE@W4_Uninitialized@1@@Z",
1167 "public: __thiscall std::basic_filebuf<char,struct std::char_traits<char> >::basic_filebuf<char,struct std::char_traits<char> >(enum std::_Uninitialized)",
1168 "public: __thiscall std::basic_filebuf<char,struct std::char_traits<char> >::basic_filebuf<char,struct std::char_traits<char> >(enum basic_filebuf<char,struct std::char_traits<char> >::_Uninitialized)"},
1169/* 10 */ {"??0?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAE@ABV01@@Z",
1170 "public: __thiscall std::basic_filebuf<unsigned short,struct std::char_traits<unsigned short> >::basic_filebuf<unsigned short,struct std::char_traits<unsigned short> >(class std::basic_filebuf<unsigned short,struct std::char_traits<unsigned short> > const &)",
1171 "public: __thiscall std::basic_filebuf<unsigned short,struct std::char_traits<unsigned short> >::basic_filebuf<unsigned short,struct std::char_traits<unsigned short> >(class basic_filebuf<unsigned short,struct std::char_traits<unsigned short> >::basic_filebuf<unsigned short,struct std::char_traits<unsigned short> > const &)"},
1172/* 11 */ {"??0?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAE@PAU_iobuf@@@Z",
1173 "public: __thiscall std::basic_filebuf<unsigned short,struct std::char_traits<unsigned short> >::basic_filebuf<unsigned short,struct std::char_traits<unsigned short> >(struct _iobuf *)"},
1174/* 12 */ {"??0?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAE@W4_Uninitialized@1@@Z",
1175 "public: __thiscall std::basic_filebuf<unsigned short,struct std::char_traits<unsigned short> >::basic_filebuf<unsigned short,struct std::char_traits<unsigned short> >(enum std::_Uninitialized)",
1176 "public: __thiscall std::basic_filebuf<unsigned short,struct std::char_traits<unsigned short> >::basic_filebuf<unsigned short,struct std::char_traits<unsigned short> >(enum basic_filebuf<unsigned short,struct std::char_traits<unsigned short> >::_Uninitialized)"},
1177/* 13 */ {"??0?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z",
1178 "public: __thiscall std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> >::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> >(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > const &)",
1179 "public: __thiscall std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> >::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> >(class basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> >::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > const &)"},
1180/* 14 */ {"??0?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z",
1181 "public: __thiscall std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> >::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int)",
1182 "public: __thiscall std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> >::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> >(class basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int)"},
1183/* 15 */ {"??0?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@H@Z",
1184 "public: __thiscall std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> >::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> >(int)"},
1185/* 16 */ {"??0?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV01@@Z",
1186 "public: __thiscall std::basic_stringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::basic_stringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >(class std::basic_stringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &)",
1187 "public: __thiscall std::basic_stringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::basic_stringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >(class basic_stringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::basic_stringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &)"},
1188/* 17 */ {"??0?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@1@H@Z",
1189 "public: __thiscall std::basic_stringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::basic_stringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &,int)",
1190 "public: __thiscall std::basic_stringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::basic_stringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >(class basic_stringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &,int)"},
1191/* 18 */ {"??0?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@H@Z",
1192 "public: __thiscall std::basic_stringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::basic_stringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >(int)"},
1193/* 19 */ {"??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z",
1194 "public: __thiscall std::num_get<char,class std::istreambuf_iterator<char,struct std::char_traits<char> > >::num_get<char,class std::istreambuf_iterator<char,struct std::char_traits<char> > >(class std::_Locinfo const &,unsigned int)",
1195 "public: __thiscall std::num_get<char,class std::istreambuf_iterator<char,struct std::char_traits<char> > >::num_get<char,class std::istreambuf_iterator<char,struct std::char_traits<char> > >(class num_get<char,class std::istreambuf_iterator<char,struct std::char_traits<char> > >::_Locinfo const &,unsigned int)"},
1196/* 20 */ {"??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z",
1197 "public: __thiscall std::num_get<char,class std::istreambuf_iterator<char,struct std::char_traits<char> > >::num_get<char,class std::istreambuf_iterator<char,struct std::char_traits<char> > >(unsigned int)"},
1198/* 21 */ {"??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z",
1199 "public: __thiscall std::num_get<unsigned short,class std::istreambuf_iterator<unsigned short,struct std::char_traits<unsigned short> > >::num_get<unsigned short,class std::istreambuf_iterator<unsigned short,struct std::char_traits<unsigned short> > >(class std::_Locinfo const &,unsigned int)",
1200 "public: __thiscall std::num_get<unsigned short,class std::istreambuf_iterator<unsigned short,struct std::char_traits<unsigned short> > >::num_get<unsigned short,class std::istreambuf_iterator<unsigned short,struct std::char_traits<unsigned short> > >(class num_get<unsigned short,class std::istreambuf_iterator<unsigned short,struct std::char_traits<unsigned short> > >::_Locinfo const &,unsigned int)"},
1201/* 22 */ {"??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z", "public: __thiscall std::num_get<unsigned short,class std::istreambuf_iterator<unsigned short,struct std::char_traits<unsigned short> > >::num_get<unsigned short,class std::istreambuf_iterator<unsigned short,struct std::char_traits<unsigned short> > >(unsigned int)"},
1202/* 23 */ {"??0streambuf@@QAE@ABV0@@Z", "public: __thiscall streambuf::streambuf(class streambuf const &)"},
1203/* 24 */ {"??0strstreambuf@@QAE@ABV0@@Z", "public: __thiscall strstreambuf::strstreambuf(class strstreambuf const &)"},
1204/* 25 */ {"??0strstreambuf@@QAE@H@Z", "public: __thiscall strstreambuf::strstreambuf(int)"},
1205/* 26 */ {"??0strstreambuf@@QAE@P6APAXJ@ZP6AXPAX@Z@Z", "public: __thiscall strstreambuf::strstreambuf(void * (__cdecl*)(long),void (__cdecl*)(void *))"},
1206/* 27 */ {"??0strstreambuf@@QAE@PADH0@Z", "public: __thiscall strstreambuf::strstreambuf(char *,int,char *)"},
1207/* 28 */ {"??0strstreambuf@@QAE@PAEH0@Z", "public: __thiscall strstreambuf::strstreambuf(unsigned char *,int,unsigned char *)"},
1208/* 29 */ {"??0strstreambuf@@QAE@XZ", "public: __thiscall strstreambuf::strstreambuf(void)"},
1209/* 30 */ {"??1__non_rtti_object@std@@UAE@XZ", "public: virtual __thiscall std::__non_rtti_object::~__non_rtti_object(void)"},
1210/* 31 */ {"??1__non_rtti_object@@UAE@XZ", "public: virtual __thiscall __non_rtti_object::~__non_rtti_object(void)"},
1211/* 32 */ {"??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@UAE@XZ", "public: virtual __thiscall std::num_get<char,class std::istreambuf_iterator<char,struct std::char_traits<char> > >::~num_get<char,class std::istreambuf_iterator<char,struct std::char_traits<char> > >(void)"},
1212/* 33 */ {"??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@UAE@XZ", "public: virtual __thiscall std::num_get<unsigned short,class std::istreambuf_iterator<unsigned short,struct std::char_traits<unsigned short> > >::~num_get<unsigned short,class std::istreambuf_iterator<unsigned short,struct std::char_traits<unsigned short> > >(void)"},
1213/* 34 */ {"??4istream_withassign@@QAEAAV0@ABV0@@Z", "public: class istream_withassign & __thiscall istream_withassign::operator=(class istream_withassign const &)"},
1214/* 35 */ {"??4istream_withassign@@QAEAAVistream@@ABV1@@Z", "public: class istream & __thiscall istream_withassign::operator=(class istream const &)"},
1215/* 36 */ {"??4istream_withassign@@QAEAAVistream@@PAVstreambuf@@@Z", "public: class istream & __thiscall istream_withassign::operator=(class streambuf *)"},
1216/* 37 */ {"??5std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@AAC@Z", "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl std::operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,signed char &)"},
1217/* 38 */ {"??5std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@AAD@Z", "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl std::operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,char &)"},
1218/* 39 */ {"??5std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@AAE@Z", "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl std::operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,unsigned char &)"},
1219/* 40 */ {"??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z", "public: class std::basic_ostream<unsigned short,struct std::char_traits<unsigned short> > & __thiscall std::basic_ostream<unsigned short,struct std::char_traits<unsigned short> >::operator<<(class std::ios_base & (__cdecl*)(class std::ios_base &))"},
1220/* 41 */ {"??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z", "public: class std::basic_ostream<unsigned short,struct std::char_traits<unsigned short> > & __thiscall std::basic_ostream<unsigned short,struct std::char_traits<unsigned short> >::operator<<(class std::basic_streambuf<unsigned short,struct std::char_traits<unsigned short> > *)"},
1221/* 42 */ {"??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@PBX@Z", "public: class std::basic_ostream<unsigned short,struct std::char_traits<unsigned short> > & __thiscall std::basic_ostream<unsigned short,struct std::char_traits<unsigned short> >::operator<<(void const *)"},
1222/* 43 */ {"??_8?$basic_fstream@DU?$char_traits@D@std@@@std@@7B?$basic_ostream@DU?$char_traits@D@std@@@1@@", "const std::basic_fstream<char,struct std::char_traits<char> >::`vbtable'{for `std::basic_ostream<char,struct std::char_traits<char> >'}"},
1223/* 44 */ {"??_8?$basic_fstream@GU?$char_traits@G@std@@@std@@7B?$basic_istream@GU?$char_traits@G@std@@@1@@", "const std::basic_fstream<unsigned short,struct std::char_traits<unsigned short> >::`vbtable'{for `std::basic_istream<unsigned short,struct std::char_traits<unsigned short> >'}"},
1224/* 45 */ {"??_8?$basic_fstream@GU?$char_traits@G@std@@@std@@7B?$basic_ostream@GU?$char_traits@G@std@@@1@@", "const std::basic_fstream<unsigned short,struct std::char_traits<unsigned short> >::`vbtable'{for `std::basic_ostream<unsigned short,struct std::char_traits<unsigned short> >'}"},
1225/* 46 */ {"??9std@@YA_NPBDABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z", "bool __cdecl std::operator!=(char const *,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)"},
1226/* 47 */ {"??9std@@YA_NPBGABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@0@@Z", "bool __cdecl std::operator!=(unsigned short const *,class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &)"},
1227/* 48 */ {"??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAADI@Z", "public: char & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator[](unsigned int)"},
1228/* 49 */ {"??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEABDI@Z", "public: char const & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator[](unsigned int)const "},
1229/* 50 */ {"??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAGI@Z", "public: unsigned short & __thiscall std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::operator[](unsigned int)"},
1230/* 51 */ {"??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEABGI@Z", "public: unsigned short const & __thiscall std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::operator[](unsigned int)const "},
1231/* 52 */ {"?abs@std@@YAMABV?$complex@M@1@@Z", "float __cdecl std::abs(class std::complex<float> const &)"},
1232/* 53 */ {"?abs@std@@YANABV?$complex@N@1@@Z", "double __cdecl std::abs(class std::complex<double> const &)"},
1233/* 54 */ {"?abs@std@@YAOABV?$complex@O@1@@Z", "long double __cdecl std::abs(class std::complex<long double> const &)"},
1234/* 55 */ {"?cin@std@@3V?$basic_istream@DU?$char_traits@D@std@@@1@A", "class std::basic_istream<char,struct std::char_traits<char> > std::cin"},
1235/* 56 */ {"?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAG@Z", "protected: virtual class std::istreambuf_iterator<char,struct std::char_traits<char> > __thiscall std::num_get<char,class std::istreambuf_iterator<char,struct std::char_traits<char> > >::do_get(class std::istreambuf_iterator<char,struct std::char_traits<char> >,class std::istreambuf_iterator<char,struct std::char_traits<char> >,class std::ios_base &,int &,unsigned short &)const "},
1236/* 57 */ {"?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAI@Z", "protected: virtual class std::istreambuf_iterator<char,struct std::char_traits<char> > __thiscall std::num_get<char,class std::istreambuf_iterator<char,struct std::char_traits<char> > >::do_get(class std::istreambuf_iterator<char,struct std::char_traits<char> >,class std::istreambuf_iterator<char,struct std::char_traits<char> >,class std::ios_base &,int &,unsigned int &)const "},
1237/* 58 */ {"?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z", "protected: virtual class std::istreambuf_iterator<char,struct std::char_traits<char> > __thiscall std::num_get<char,class std::istreambuf_iterator<char,struct std::char_traits<char> > >::do_get(class std::istreambuf_iterator<char,struct std::char_traits<char> >,class std::istreambuf_iterator<char,struct std::char_traits<char> >,class std::ios_base &,int &,long &)const "},
1238/* 59 */ {"?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAK@Z", "protected: virtual class std::istreambuf_iterator<char,struct std::char_traits<char> > __thiscall std::num_get<char,class std::istreambuf_iterator<char,struct std::char_traits<char> > >::do_get(class std::istreambuf_iterator<char,struct std::char_traits<char> >,class std::istreambuf_iterator<char,struct std::char_traits<char> >,class std::ios_base &,int &,unsigned long &)const "},
1239/* 60 */ {"?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAM@Z", "protected: virtual class std::istreambuf_iterator<char,struct std::char_traits<char> > __thiscall std::num_get<char,class std::istreambuf_iterator<char,struct std::char_traits<char> > >::do_get(class std::istreambuf_iterator<char,struct std::char_traits<char> >,class std::istreambuf_iterator<char,struct std::char_traits<char> >,class std::ios_base &,int &,float &)const "},
1240/* 61 */ {"?_query_new_handler@@YAP6AHI@ZXZ", "int (__cdecl*__cdecl _query_new_handler(void))(unsigned int)"},
1241/* 62 */ {"?register_callback@ios_base@std@@QAEXP6AXW4event@12@AAV12@H@ZH@Z", "public: void __thiscall std::ios_base::register_callback(void (__cdecl*)(enum std::ios_base::event,class std::ios_base &,int),int)"},
1242/* 63 */ {"?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@JW4seekdir@ios_base@2@@Z", "public: class std::basic_istream<char,struct std::char_traits<char> > & __thiscall std::basic_istream<char,struct std::char_traits<char> >::seekg(long,enum std::ios_base::seekdir)"},
1243/* 64 */ {"?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z", "public: class std::basic_istream<char,struct std::char_traits<char> > & __thiscall std::basic_istream<char,struct std::char_traits<char> >::seekg(class std::fpos<int>)"},
1244/* 65 */ {"?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@JW4seekdir@ios_base@2@@Z", "public: class std::basic_istream<unsigned short,struct std::char_traits<unsigned short> > & __thiscall std::basic_istream<unsigned short,struct std::char_traits<unsigned short> >::seekg(long,enum std::ios_base::seekdir)"},
1245/* 66 */ {"?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z", "public: class std::basic_istream<unsigned short,struct std::char_traits<unsigned short> > & __thiscall std::basic_istream<unsigned short,struct std::char_traits<unsigned short> >::seekg(class std::fpos<int>)"},
1246/* 67 */ {"?seekoff@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MAE?AV?$fpos@H@2@JW4seekdir@ios_base@2@H@Z", "protected: virtual class std::fpos<int> __thiscall std::basic_filebuf<char,struct std::char_traits<char> >::seekoff(long,enum std::ios_base::seekdir,int)"},
1247/* 68 */ {"?seekoff@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MAE?AV?$fpos@H@2@JW4seekdir@ios_base@2@H@Z", "protected: virtual class std::fpos<int> __thiscall std::basic_filebuf<unsigned short,struct std::char_traits<unsigned short> >::seekoff(long,enum std::ios_base::seekdir,int)"},
1248/* 69 */ {"?set_new_handler@@YAP6AXXZP6AXXZ@Z", "void (__cdecl*__cdecl set_new_handler(void (__cdecl*)(void)))(void)"},
1249/* 70 */ {"?str@?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z", "public: void __thiscall std::basic_istringstream<char,struct std::char_traits<char>,class std::allocator<char> >::str(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)"},
1250/* 71 */ {"?str@?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ", "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall std::basic_istringstream<char,struct std::char_traits<char>,class std::allocator<char> >::str(void)const "},
1251/* 72 */ {"?str@?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z", "public: void __thiscall std::basic_istringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::str(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &)"},
1252/* 73 */ {"?str@?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ", "public: class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > __thiscall std::basic_istringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::str(void)const "},
1253/* 74 */ {"?str@?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z", "public: void __thiscall std::basic_ostringstream<char,struct std::char_traits<char>,class std::allocator<char> >::str(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)"},
1254/* 75 */ {"?str@?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ", "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall std::basic_ostringstream<char,struct std::char_traits<char>,class std::allocator<char> >::str(void)const "},
1255/* 76 */ {"?str@?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z", "public: void __thiscall std::basic_ostringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::str(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &)"},
1256/* 77 */ {"?str@?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ", "public: class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > __thiscall std::basic_ostringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::str(void)const "},
1257/* 78 */ {"?str@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z", "public: void __thiscall std::basic_stringbuf<char,struct std::char_traits<char>,class std::allocator<char> >::str(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)"},
1258/* 79 */ {"?str@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ", "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall std::basic_stringbuf<char,struct std::char_traits<char>,class std::allocator<char> >::str(void)const "},
1259/* 80 */ {"?str@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z", "public: void __thiscall std::basic_stringbuf<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::str(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &)"},
1260/* 81 */ {"?str@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ", "public: class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > __thiscall std::basic_stringbuf<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::str(void)const "},
1261/* 82 */ {"?str@?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z", "public: void __thiscall std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> >::str(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)"},
1262/* 83 */ {"?str@?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ", "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> >::str(void)const "},
1263/* 84 */ {"?str@?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z", "public: void __thiscall std::basic_stringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::str(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &)"},
1264/* 85 */ {"?str@?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ", "public: class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > __thiscall std::basic_stringstream<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::str(void)const "},
1265/* 86 */ {"?_Sync@ios_base@std@@0_NA", "private: static bool std::ios_base::_Sync"},
1266/* 87 */ {"??_U@YAPAXI@Z", "void * __cdecl operator new[](unsigned int)"},
1267/* 88 */ {"??_V@YAXPAX@Z", "void __cdecl operator delete[](void *)"},
1268/* 89 */ {"??X?$_Complex_base@M@std@@QAEAAV01@ABM@Z", "public: class std::_Complex_base<float> & __thiscall std::_Complex_base<float>::operator*=(float const &)"},
1269/* 90 */ {"??Xstd@@YAAAV?$complex@M@0@AAV10@ABV10@@Z", "class std::complex<float> & __cdecl std::operator*=(class std::complex<float> &,class std::complex<float> const &)"},
1270/* 91 */ {"?aaa@@YAHAAUbbb@@@Z", "int __cdecl aaa(struct bbb &)"},
1271/* 92 */ {"?aaa@@YAHBAUbbb@@@Z", "int __cdecl aaa(struct bbb & volatile)"},
1272/* 93 */ {"?aaa@@YAHPAUbbb@@@Z", "int __cdecl aaa(struct bbb *)"},
1273/* 94 */ {"?aaa@@YAHQAUbbb@@@Z", "int __cdecl aaa(struct bbb * const)"},
1274/* 95 */ {"?aaa@@YAHRAUbbb@@@Z", "int __cdecl aaa(struct bbb * volatile)"},
1275/* 96 */ {"?aaa@@YAHSAUbbb@@@Z", "int __cdecl aaa(struct bbb * const volatile)"},
1276/* 97 */ {"??0aa.a@@QAE@XZ", "??0aa.a@@QAE@XZ"},
1277/* 98 */ {"??0aa$_3a@@QAE@XZ", "public: __thiscall aa$_3a::aa$_3a(void)"},
1278/* 99 */ {"??2?$aaa@AAUbbb@@AAUccc@@AAU2@@ddd@1eee@2@QAEHXZ", "public: int __thiscall eee::eee::ddd::ddd::aaa<struct bbb &,struct ccc &,struct ccc &>::operator new(void)"},
1279/* 100 */ {"?pSW@@3P6GHKPAX0PAU_tagSTACKFRAME@@0P6GH0K0KPAK@ZP6GPAX0K@ZP6GK0K@ZP6GK00PAU_tagADDRESS@@@Z@ZA", "int (__stdcall* pSW)(unsigned long,void *,void *,struct _tagSTACKFRAME *,void *,int (__stdcall*)(void *,unsigned long,void *,unsigned long,unsigned long *),void * (__stdcall*)(void *,unsigned long),unsigned long (__stdcall*)(void *,unsigned long),unsigned long (__stdcall*)(void *,void *,struct _tagADDRESS *))"},
1280/* 101 */ {"?$_aaa@Vbbb@@", "_aaa<class bbb>"},
1281/* 102 */ {"?$aaa@Vbbb@ccc@@Vddd@2@", "aaa<class ccc::bbb,class ccc::ddd>"},
1282/* 103 */ { "??0?$Foo@P6GHPAX0@Z@@QAE@PAD@Z", "public: __thiscall Foo<int (__stdcall*)(void *,void *)>::Foo<int (__stdcall*)(void *,void *)>(char *)"},
1283/* 104 */ { "??0?$Foo@P6GHPAX0@Z@@QAE@PAD@Z", "__thiscall Foo<int (__stdcall*)(void *,void *)>::Foo<int (__stdcall*)(void *,void *)>(char *)", NULL, 0x880},
1284/* 105 */ { "?Qux@Bar@@0PAP6AHPAV1@AAH1PAH@ZA", "private: static int (__cdecl** Bar::Qux)(class Bar *,int &,int &,int *)" },
1285/* 106 */ { "?Qux@Bar@@0PAP6AHPAV1@AAH1PAH@ZA", "Bar::Qux", NULL, 0x1800},
1286/* 107 */ {"?$AAA@$DBAB@", "AAA<`template-parameter257'>"},
1287/* 108 */ {"?$AAA@?C@", "AAA<`template-parameter-2'>"},
1288/* 109 */ {"?$AAA@PAUBBB@@", "AAA<struct BBB *>"},
1289/* 110 */ {"??$ccccc@PAVaaa@@@bar@bb@foo@@DGPAV0@PAV0@PAVee@@IPAPAVaaa@@1@Z",
1290 "private: static class bar * __stdcall foo::bb::bar::ccccc<class aaa *>(class bar *,class ee *,unsigned int,class aaa * *,class ee *)",
1291 "??$ccccc@PAVaaa@@@bar@bb@foo@@DGPAV0@PAV0@PAVee@@IPAPAVaaa@@1@Z"},
1292/* 111 */ {"?f@T@@QAEHQCY1BE@BO@D@Z", "public: int __thiscall T::f(char (volatile * const)[20][30])"},
1293/* 112 */ {"?f@T@@QAEHQAY2BE@BO@CI@D@Z", "public: int __thiscall T::f(char (* const)[20][30][40])"},
1294/* 113 */ {"?f@T@@QAEHQAY1BE@BO@$$CBD@Z", "public: int __thiscall T::f(char const (* const)[20][30])"},
1295/* 114 */ {"??0?$Foo@U?$vector_c@H$00$01$0?1$0A@$0A@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@@mpl@boost@@@@QAE@XZ",
1296 "public: __thiscall Foo<struct boost::mpl::vector_c<int,1,2,-2,0,0,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647> >::Foo<struct boost::mpl::vector_c<int,1,2,-2,0,0,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647> >(void)"},
1297/* 115 */ {"?swprintf@@YAHPAGIPBGZZ", "int __cdecl swprintf(unsigned short *,unsigned int,unsigned short const *,...)"},
1298/* 116 */ {"?vswprintf@@YAHPAGIPBGPAD@Z", "int __cdecl vswprintf(unsigned short *,unsigned int,unsigned short const *,char *)"},
1299/* 117 */ {"?vswprintf@@YAHPA_WIPB_WPAD@Z", "int __cdecl vswprintf(wchar_t *,unsigned int,wchar_t const *,char *)"},
1300/* 118 */ {"?swprintf@@YAHPA_WIPB_WZZ", "int __cdecl swprintf(wchar_t *,unsigned int,wchar_t const *,...)"},
1301/* 119 */ {"??Xstd@@YAAEAV?$complex@M@0@AEAV10@AEBV10@@Z", "class std::complex<float> & __ptr64 __cdecl std::operator*=(class std::complex<float> & __ptr64,class std::complex<float> const & __ptr64)"},
1302/* 120 */ {"?_Doraise@bad_cast@std@@MEBAXXZ", "protected: virtual void __cdecl std::bad_cast::_Doraise(void)const __ptr64"},
1303/* 121 */ {"??$?DM@std@@YA?AV?$complex@M@0@ABMABV10@@Z",
1304 "class std::complex<float> __cdecl std::operator*<float>(float const &,class std::complex<float> const &)",
1305 "??$?DM@std@@YA?AV?$complex@M@0@ABMABV10@@Z"},
1306/* 122 */ {"?_R2@?BN@???$_Fabs@N@std@@YANAEBV?$complex@N@1@PEAH@Z@4NB",
1307 "double const `double __cdecl std::_Fabs<double>(class std::complex<double> const & __ptr64,int * __ptr64)'::`29'::_R2",
1308 "?_R2@?BN@???$_Fabs@N@std@@YANAEBV?$complex@N@1@PEAH@Z@4NB"},
1309/* 123 */ {"?vtordisp_thunk@std@@$4PPPPPPPM@3EAA_NXZ",
1310 "[thunk]:public: virtual bool __cdecl std::vtordisp_thunk`vtordisp{4294967292,4}' (void) __ptr64",
1311 "[thunk]:public: virtual bool __cdecl std::vtordisp_thunk`vtordisp{-4,4}' (void) __ptr64"},
1312/* 124 */ {"??_9CView@@$BBII@AE",
1313 "[thunk]: __thiscall CView::`vcall'{392,{flat}}' }'",
1314 "[thunk]: __thiscall CView::`vcall'{392,{flat}}' "},
1315/* 125 */ {"?_dispatch@_impl_Engine@SalomeApp@@$R4CE@BA@PPPPPPPM@7AE_NAAVomniCallHandle@@@Z",
1316 "[thunk]:public: virtual bool __thiscall SalomeApp::_impl_Engine::_dispatch`vtordispex{36,16,4294967292,8}' (class omniCallHandle &)",
1317 "?_dispatch@_impl_Engine@SalomeApp@@$R4CE@BA@PPPPPPPM@7AE_NAAVomniCallHandle@@@Z"},
1318/* 126 */ {"?_Doraise@bad_cast@std@@MEBAXXZ", "protected: virtual void __cdecl std::bad_cast::_Doraise(void)", NULL, 0x60},
1319/* 127 */ {"??Xstd@@YAAEAV?$complex@M@0@AEAV10@AEBV10@@Z", "class std::complex<float> & ptr64 cdecl std::operator*=(class std::complex<float> & ptr64,class std::complex<float> const & ptr64)", NULL, 1},
1320/* 128 */ {"??Xstd@@YAAEAV?$complex@M@0@AEAV10@AEBV10@@Z",
1321 "class std::complex<float> & std::operator*=(class std::complex<float> &,class std::complex<float> const &)",
1322 "??Xstd@@YAAEAV?$complex@M@0@AEAV10@AEBV10@@Z", 2},
1323/* 129 */ {"??$run@XVTask_Render_Preview@@@QtConcurrent@@YA?AV?$QFuture@X@@PEAVTask_Render_Preview@@P82@EAAXXZ@Z",
1324 "class QFuture<void> __cdecl QtConcurrent::run<void,class Task_Render_Preview>(class Task_Render_Preview * __ptr64,void (__cdecl Task_Render_Preview::*)(void) __ptr64)",
1325 "??$run@XVTask_Render_Preview@@@QtConcurrent@@YA?AV?$QFuture@X@@PEAVTask_Render_Preview@@P82@EAAXXZ@Z"},
1326/* 130 */ {"??_E?$TStrArray@$$BY0BAA@D$0BA@@@UAEPAXI@Z",
1327 "public: virtual void * __thiscall TStrArray<char [256],16>::`vector deleting destructor'(unsigned int)"},
1328 };
1329 int i, num_test = ARRAY_SIZE(test);
1330 char* name;
1331
1332 for (i = 0; i < num_test; i++)
1333 {
1334 name = p__unDName(0, test[i].in, 0, pmalloc, pfree, test[i].flags);
1335 ok(name != NULL, "%u: unDName failed\n", i);
1336 if (!name) continue;
1337 ok( !strcmp_space(test[i].out, name) ||
1339 "%u: Got name \"%s\"\n", i, name );
1340 ok( !strcmp_space(test[i].out, name) ||
1342 "%u: Expected \"%s\"\n", i, test[i].out );
1343 pfree(name);
1344 }
1345}
1346
1348{
1349 if (!InitFunctionPtrs())
1350 return;
1351
1354 test_bad_cast();
1357 test_rtti();
1359 test_demangle();
1360}
#define broken(x)
Definition: _sntprintf.h:21
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define __cdecl
Definition: accygwin.h:79
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
#define ARRAY_SIZE(A)
Definition: main.h:33
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned short WORD
Definition: ntddk_ex.h:93
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLenum func
Definition: glext.h:6028
GLuint res
Definition: glext.h:9613
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLuint in
Definition: glext.h:9616
GLbitfield flags
Definition: glext.h:7161
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
GLuint64EXT * result
Definition: glext.h:11304
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define e
Definition: ke_i.h:82
#define b
Definition: ke_i.h:79
struct S1 s1
struct S2 s2
#define todo_wine_if(is_todo)
Definition: custom.c:76
#define RTTI_REF_SIG0(instance, name, base)
Definition: cpp.c:894
#define SETNOFAIL(x, y)
Definition: cpp.c:160
static void * get_obj_locator(void *cppobj)
Definition: cpp.c:885
static char *__thiscall * ptype_info_raw_name(type_info *)
struct __type_info type_info
static void test_demangle_datatype(void)
Definition: cpp.c:1098
#define __thiscall
Definition: cpp.c:43
static vtable_ptr * pbad_typeid_vtable
Definition: cpp.c:72
static char *__thiscall * pexception_what(exception *)
static void test_bad_typeid(void)
Definition: cpp.c:470
struct __exception exception
static exception *__thiscall * pexception_opequals(exception *, exception *)
#define SET(x, y)
Definition: cpp.c:161
static char *__thiscall * pbad_typeid_what(exception *)
static exception *__thiscall * pbad_typeid_opequals(exception *, exception *)
#define DEFINE_RTTI_REF(type, name)
Definition: cpp.c:892
static HMODULE hMsvcrt
Definition: cpp.c:47
static char *__thiscall * pbad_cast_what(exception *)
#define call_func2(func, _this, a)
Definition: cpp.c:155
static void *__cdecl * pmalloc(unsigned int)
static void *__cdecl * p__RTCastToVoid(void *)
static void * bAncientVersion
Definition: cpp.c:116
#define call_func1(func, _this)
Definition: cpp.c:154
static char *__cdecl * p__unDName(char *, const char *, int, void *, void *, unsigned short int)
static vtable_ptr * p__non_rtti_object_vtable
Definition: cpp.c:94
static void test_bad_cast(void)
Definition: cpp.c:587
static void *__cdecl * poperator_new(unsigned int)
static void test_type_info(void)
Definition: cpp.c:813
static void *__cdecl * p__RTDynamicCast(void *, int, void *, void *, int)
static exception *__thiscall * pbad_cast_opequals(exception *, exception *)
static char *__thiscall * ptype_info_name(type_info *)
static int strcmp_space(const char *s1, const char *s2)
Definition: cpp.c:1126
static void test_demangle(void)
Definition: cpp.c:1142
#define init_thiscall_thunk()
Definition: cpp.c:153
static vtable_ptr * pbad_cast_vtable
Definition: cpp.c:84
static vtable_ptr * pexception_vtable
Definition: cpp.c:61
static exception *__thiscall * p__non_rtti_object_opequals(exception *, exception *)
static BOOL InitFunctionPtrs(void)
Definition: cpp.c:163
static void test_exception(void)
Definition: cpp.c:349
static LPCSTR
Definition: cpp.c:66
void(* vtable_ptr)(void)
Definition: cpp.c:23
static char *__thiscall * p__non_rtti_object_what(exception *)
static void test_rtti(void)
Definition: cpp.c:901
static unsigned int
Definition: cpp.c:62
static type_info *static type_info *static type_info *static type_info *__cdecl * p__RTtypeid(void *)
#define RTTI_REF(instance, name)
Definition: cpp.c:893
static void test___non_rtti_object(void)
Definition: cpp.c:712
static vtable_ptr * get_vtable(void *obj)
Definition: cpp.c:880
static void * vtable[]
Definition: typelib.c:1231
#define MEM_COMMIT
Definition: nt_native.h:1313
#define PAGE_EXECUTE_READWRITE
Definition: nt_native.h:1308
static FILE * out
Definition: regtests2xml.c:44
#define test
Definition: rosglue.h:37
#define win_skip
Definition: test.h:160
#define memset(x, y, z)
Definition: compat.h:39
char * name
Definition: cpp.c:28
vtable_ptr * vtable
Definition: cpp.c:27
int do_free
Definition: cpp.c:29
vtable_ptr * vtable
Definition: cpp.c:34
char mangled[16]
Definition: cpp.c:36
char * name
Definition: cpp.c:35
LPCSTR mangled
Definition: cpp.c:1093
BOOL test_in_wine
Definition: cpp.c:1095
LPCSTR result
Definition: cpp.c:1094
char * name
Definition: compiler.c:66
Definition: name.c:39
Definition: cproxy.c:248
LPVOID NTAPI VirtualAlloc(IN LPVOID lpAddress, IN SIZE_T dwSize, IN DWORD flAllocationType, IN DWORD flProtect)
Definition: virtmem.c:65
#define WINAPI
Definition: msvc.h:6
void(* vtable_ptr)(void)
Definition: cppexcept.h:33
const char * LPCSTR
Definition: xmlstorage.h:183
unsigned char BYTE
Definition: xxhash.c:193