diff --git a/Test/CMakeLists.txt b/Test/CMakeLists.txt index caafefef..749f6711 100644 --- a/Test/CMakeLists.txt +++ b/Test/CMakeLists.txt @@ -26,6 +26,7 @@ set(TESTS WeakReferences_arc.m objc_msgSend.m msgInterpose.m + NilException.m MethodArguments.m ) diff --git a/Test/NilException.m b/Test/NilException.m new file mode 100644 index 00000000..de856635 --- /dev/null +++ b/Test/NilException.m @@ -0,0 +1,49 @@ +#include "Test.h" + + +#ifdef __has_attribute +#if __has_attribute(objc_root_class) +__attribute__((objc_root_class)) +#endif +#endif +@interface NSObject +{ + Class isa; +} +@end + +@implementation NSObject ++ (id)new +{ + return class_createInstance(self, 0); +} +@end +int main(void) +{ + BOOL caught_exception = NO; + @try + { + @throw(nil); + } + @catch (NSObject* o) + { + assert(0); + } + @catch (id x) + { + assert(nil == x); + caught_exception = YES; + } + assert(caught_exception == YES); + caught_exception = NO; + @try + { + @throw(nil); + } + @catch (...) + { + caught_exception = YES; + } + assert(caught_exception == YES); + return 0; +} diff --git a/eh_personality.c b/eh_personality.c index 5308862b..e5abf5a4 100644 --- a/eh_personality.c +++ b/eh_personality.c @@ -358,7 +358,10 @@ static inline _Unwind_Reason_Code internal_objc_personality(int version, else if (!foreignException) { ex = objc_exception_from_header(exceptionObject); - thrown_class = classForObject(ex->object); + if (ex->object != nil) + { + thrown_class = classForObject(ex->object); + } } else if (_objc_class_for_boxing_foreign_exception) {