You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
1.4 KiB
Objective-C
102 lines
1.4 KiB
Objective-C
#include "Test.h"
|
|
|
|
#if __cplusplus
|
|
#error This is not an ObjC++ test!
|
|
#endif
|
|
|
|
BOOL finallyEntered = NO;
|
|
BOOL cleanupRun = NO;
|
|
BOOL idRethrown = NO;
|
|
BOOL catchallRethrown = NO;
|
|
BOOL testCaught = NO;
|
|
BOOL wrongMatch = NO;
|
|
|
|
@interface NSString : Test @end
|
|
void runCleanup(void *x)
|
|
{
|
|
assert(cleanupRun == NO);
|
|
cleanupRun = YES;
|
|
}
|
|
|
|
int throw(void)
|
|
{
|
|
@throw [Test new];
|
|
}
|
|
|
|
int finally(void)
|
|
{
|
|
__attribute__((cleanup(runCleanup)))
|
|
int x;
|
|
(void)x;
|
|
@try { throw(); }
|
|
@finally { finallyEntered = YES; }
|
|
return 0;
|
|
}
|
|
int rethrow_id(void)
|
|
{
|
|
@try { finally(); }
|
|
@catch(id x)
|
|
{
|
|
assert(object_getClass(x) == [Test class]);
|
|
idRethrown = YES;
|
|
@throw;
|
|
}
|
|
return 0;
|
|
}
|
|
int rethrow_test(void)
|
|
{
|
|
@try { rethrow_id(); }
|
|
@catch (Test *t)
|
|
{
|
|
testCaught = YES;
|
|
@throw;
|
|
}
|
|
@catch (id x)
|
|
{
|
|
assert(0 && "should not be reached!");
|
|
}
|
|
@catch (...)
|
|
{
|
|
assert(0 && "should not be reached!");
|
|
}
|
|
}
|
|
int rethrow_catchall(void)
|
|
{
|
|
@try { rethrow_test(); }
|
|
@catch(...)
|
|
{
|
|
assert(testCaught);
|
|
catchallRethrown = YES;
|
|
@throw;
|
|
}
|
|
return 0;
|
|
}
|
|
int not_matched_catch(void)
|
|
{
|
|
@try { rethrow_catchall(); }
|
|
@catch(NSString *s)
|
|
{
|
|
wrongMatch = YES;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
@try
|
|
{
|
|
rethrow_catchall();
|
|
}
|
|
@catch (id x)
|
|
{
|
|
assert(finallyEntered == YES);
|
|
assert(cleanupRun == YES);
|
|
assert(idRethrown == YES);
|
|
assert(catchallRethrown == YES);
|
|
assert(wrongMatch == NO);
|
|
assert(object_getClass(x) == [Test class]);
|
|
[x dealloc];
|
|
}
|
|
return 0;
|
|
}
|