| // RUN: %clang_cc1 -x objective-c++ -fcxx-exceptions -fsyntax-only -Werror -verify -Wno-objc-root-class %s |
| // rdar://10387088 |
| |
| @interface MyClass |
| - (void)someMethod; |
| @end |
| |
| struct BadReturn { |
| BadReturn(MyClass * myObject); |
| int bar(MyClass * myObject); |
| void MemFunc(MyClass * myObject); |
| int i; |
| MyClass *CObj; |
| }; |
| |
| @implementation MyClass |
| - (void)someMethod { |
| [self privateMethod]; // clang already does not warn here |
| } |
| |
| int BadReturn::bar(MyClass * myObject) { |
| [myObject privateMethod]; |
| return 0; |
| } |
| |
| BadReturn::BadReturn(MyClass * myObject) try : CObj(myObject) { |
| } catch(...) { |
| try { |
| [myObject privateMethod]; |
| [myObject privateMethod1]; |
| getMe = bar(myObject); // expected-error {{cannot refer to a non-static member from the handler of a constructor function try block}} |
| [CObj privateMethod1]; // expected-error {{cannot refer to a non-static member from the handler of a constructor function try block}} |
| } catch(int ei) { |
| i = ei; // expected-error {{cannot refer to a non-static member from the handler of a constructor function try block}} |
| } catch(...) { |
| { |
| i = 0; // expected-error {{cannot refer to a non-static member from the handler of a constructor function try block}} |
| } |
| } |
| } |
| |
| void BadReturn::MemFunc(MyClass * myObject) try { |
| } catch(...) { |
| try { |
| [myObject privateMethod]; |
| [myObject privateMethod1]; |
| getMe = bar(myObject); |
| [CObj privateMethod1]; |
| } catch(int ei) { |
| i = ei; |
| } catch(...) { |
| { |
| i = 0; |
| } |
| } |
| } |
| |
| - (void)privateMethod { } |
| |
| - (void)privateMethod1 { |
| getMe = getMe+1; |
| } |
| |
| static int getMe; |
| |
| @end |