blob: 2499931589b910733b9d83d668802c234d657da3 [file] [log] [blame]
// Copyright (C) 2000 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 6 June 2000 <nathan@codesourcery.com>
// Check we can throw a bad_alloc exception when malloc dies
static __SIZE_TYPE__ arena[32767]; // so things can initialize
static int fail;
static unsigned pos;
extern "C" void *malloc (__SIZE_TYPE__ size)
{
__SIZE_TYPE__ *p = &arena[pos];
if (fail)
return 0;
arena[pos] = size;
size = (size + 4 * sizeof (__SIZE_TYPE__) - 1)
/ sizeof (__SIZE_TYPE__) & ~3; // Yes, this is a hack
pos += size + 4;
return p + 4;
}
extern "C" void free (void *)
{
}
extern "C" void *realloc (void *p, __SIZE_TYPE__ size)
{
void *r = malloc (size);
unsigned int oldSize;
if (r && p)
{
oldSize = ((__SIZE_TYPE__ *)p)[-4];
if (oldSize < size)
size = oldSize;
while (size--)
((char *)r)[size] = ((char *)p)[size];
}
free (p);
return r;
}
void fn_throw() throw(int)
{
throw 1;
}
void fn_rethrow() throw(int)
{
try{fn_throw();}
catch(int a){
throw;}
}
void fn_catchthrow() throw(int)
{
try{fn_throw();}
catch(int a){
throw a + 1;}
}
int main()
{
fail = 1;
try{fn_throw();}
catch(int a){}
try{fn_rethrow();}
catch(int a){}
try{fn_catchthrow();}
catch(int a){}
return 0;
}