#include "gc_cpp.h"
-void* operator new( size_t size ) {
+#if !defined(GC_NEW_DELETE_NEED_THROW) && defined(__GNUC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
+# define GC_NEW_DELETE_NEED_THROW
+#endif
+
+#ifdef GC_NEW_DELETE_NEED_THROW
+# include <new> /* for std::bad_alloc */
+# define GC_DECL_NEW_THROW throw(std::bad_alloc)
+# define GC_DECL_DELETE_THROW throw()
+#else
+# define GC_DECL_NEW_THROW /* empty */
+# define GC_DECL_DELETE_THROW /* empty */
+#endif /* !GC_NEW_DELETE_NEED_THROW */
+
+void* operator new( size_t size ) GC_DECL_NEW_THROW {
return GC_MALLOC_UNCOLLECTABLE(size);
}
#if !defined(__CYGWIN__)
- void operator delete( void* obj ) {
+ void operator delete( void* obj ) GC_DECL_DELETE_THROW {
GC_FREE(obj);
}
#endif /* !__CYGWIN__ */
#ifdef GC_OPERATOR_NEW_ARRAY
- void* operator new[]( size_t size ) {
+ void* operator new[]( size_t size ) GC_DECL_NEW_THROW {
return GC_MALLOC_UNCOLLECTABLE(size);
}
- void operator delete[]( void* obj ) {
+ void operator delete[]( void* obj ) GC_DECL_DELETE_THROW {
GC_FREE(obj);
}
#endif /* GC_OPERATOR_NEW_ARRAY */
// This new operator is used by VC++ in case of Debug builds!
void* operator new( size_t size, int /* nBlockUse */,
- const char * szFileName, int nLine )
+ const char * szFileName, int nLine ) GC_DECL_NEW_THROW
{
# ifndef GC_DEBUG
return GC_malloc_uncollectable(size);
# if _MSC_VER > 1020
// This new operator is used by VC++ 7.0 and later in Debug builds.
void* operator new[]( size_t size, int nBlockUse,
- const char* szFileName, int nLine )
+ const char* szFileName, int nLine ) GC_DECL_NEW_THROW
{
return operator new(size, nBlockUse, szFileName, nLine);
}