49static int recursive_new_nothrow = 0;
50static int recursive_delete_nothrow = 0;
70#if !defined (_RWSTD_NO_EXT_OPERATOR_NEW) && \
71 defined (_RWSTD_NO_OPERATOR_NEW_NOTHROW)
78 if (recursive_new_nothrow++)
83 --recursive_new_nothrow;
93#if !defined (_RWSTD_NO_EXT_OPERATOR_NEW) && \
94 defined (_RWSTD_NO_OPERATOR_NEW_NOTHROW)
96 if (recursive_delete_nothrow++ || recursive_new_nothrow)
99 ::operator
delete (
ptr, std::nothrow);
101 --recursive_delete_nothrow;
155#define TEST_OP_THROWS(expr,cond,tag) \
157 alloc._failAlloc = true; \
159 rw_assert (cond, 0, __LINE__, tag); \
161 _CATCH (std::bad_alloc) { \
162 RW_ASSERT (!cond, 0, __LINE__, tag); \
165 rw_assert (!cond, 0, __LINE__, tag); \
176 rw_assert (
false, 0, __LINE__,
"caught an unexpected exception\n");
192static void my_throw_proc (
int id,
char* what)
209 rw_assert (
p != 0, 0, __LINE__,
"std::nothrow defined");
227 = &std::bad_alloc::operator=;
235 const
char*
s = ba1.what ();
242 typedef void (*new_handler_t) ();
248 "std::set_new_handler() defined");
250 new_handler_t original_handler
253#if !defined (__EDG__) || __EDG_VERSION__ > 245 || defined (__DECCXX)
256 rw_assert (original_handler == 0, 0, __LINE__,
257 "std::set_new_handler() unexpectedly returned "
258 "installed handler");
260#define _RWSTD_NO_EXT_OPERATOR_NEW
264 new_handler_t replacement_handler
267 "std::set_new_handler() failed to return previously "
268 "installed handler");
282#ifdef _RWSTD_NO_OPERATOR_NEW_NOTHROW
296 "operator new(size_t, nothrow_t) returns 0");
299 "operator new called by operator new(size_t, nothrow)");
303#if defined (_RWSTD_NO_OPERATOR_DELETE_NOTHROW) && \
304 !defined (_RWSTD_NO_PLACEMENT_DELETE)
309 "operator delete(void*, nothrow_t) doesn't throw");
316 "operator delete(void*) called by "
317 "operator delete(void*, nothrow_t)");
321#ifdef _RWSTD_NO_OPERATOR_NEW_ARRAY
326 "operator new[] (size_t) throws bad_alloc");
331 "operator new called by operator new[](size_t)");
335#ifdef _RWSTD_NO_OPERATOR_NEW_ARRAY_NOTHROW
339 "operator new[] (size_t, nothrow_t) returns 0");
342 "operator new(size_t) called by "
343 "operator new[](size_t, nothrow_t)");
347#ifdef _RWSTD_NO_OPERATOR_DELETE_ARRAY
350 "operator delete[] (void*) doesn't throw");
353 "operator delete called by operator delete[](void*)");
357#if defined (_RWSTD_NO_OPERATOR_DELETE_ARRAY_NOTHROW) && \
358 !defined ( _RWSTD_NO_PLACEMENT_DELETE)
361 "operator delete[] (void*, nothrow_t) doesn't "
365 "operator delete(void*) called by "
366 "operator delete[](void*, nothrow_t)");
374 rw_assert (0 == recursive_new_nothrow, 0, __LINE__,
375 "operator new (size_t, nothrow_t) causes recursion");
377 rw_assert (0 == recursive_delete_nothrow, 0, __LINE__,
378 "operator delete (void*, nothrow_t) causes recursion");
388#ifndef _RWSTD_NO_REPLACEABLE_NEW_DELETE
390 const bool test_rw_allocate =
true;
397 const bool test_rw_allocate =
false;
401 if (test_rw_allocate) {
405 _RW::__rw_throw_proc = my_throw_proc;
408 for (std::size_t
i = 0;
i < 10; ++
i) {
412 const bool doFail = !!(
i % 2);
414 alloc._failAlloc =
true;
418 alloc._bytesRequested = ~i;
422 "__rw_allocate (%u) requested %u bytes",
423 i,
alloc._bytesRequested);
426 "operator new() called");
428 "allocation succeeded");
431 "my_throw_proc called");
434 _RW::__rw_deallocate (
ptr,
i);
438 "operator delete() called");
441 "allocated memory deallocated");
446 "expected bad_alloc exception");
449 "my_throw_proc called");
453 "expected std::bad_alloc exception");
461 "__rw::__rw_allocate() not exercised: "
462 "_RWSTD_NO_REPLACEABLE_NEW_DELETE #defined");
471int main (
int argc,
char* argv [])
473 return rw_test (argc, argv, __FILE__,
474 "lib.support.dynamic",
void(* default_throw_proc)(int, char *)
void my_unexpected_handler()
bool my_throw_proc_called
#define TEST_OP_THROWS(expr, cond, tag)
#define _PTR_THROWS(spec)
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
#define _RWSTD_UNUSED(arg)
#define _RWSTD_STATIC_CAST(T, x)
new_handler set_new_handler(new_handler)
unexpected_handler set_unexpected(void(*)())
_TEST_EXPORT int rw_test(int argc, char *argv[], const char *filename, const char *clause, const char *comment, int(*testfun)(int, char **), const char *optspec,...)
_TEST_EXPORT int rw_assert(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_warn(int, const char *, int, const char *,...)
void * operatorNew(std::size_t n) _THROWS((std
std::size_t _bytesRequested
void operatorDelete(void *ptr) _THROWS(())