1 | // RUN: %clang_cc1 -x objective-c++ -fcxx-exceptions -fsyntax-only -Werror -verify -Wno-objc-root-class %s |
2 | // rdar://10387088 |
3 | |
4 | @interface MyClass |
5 | - (void)someMethod; |
6 | @end |
7 | |
8 | struct BadReturn { |
9 | BadReturn(MyClass * myObject); |
10 | int bar(MyClass * myObject); |
11 | void MemFunc(MyClass * myObject); |
12 | int i; |
13 | MyClass *CObj; |
14 | }; |
15 | |
16 | @implementation MyClass |
17 | - (void)someMethod { |
18 | [self privateMethod]; // clang already does not warn here |
19 | } |
20 | |
21 | int BadReturn::bar(MyClass * myObject) { |
22 | [myObject privateMethod]; |
23 | return 0; |
24 | } |
25 | |
26 | BadReturn::BadReturn(MyClass * myObject) try : CObj(myObject) { |
27 | } catch(...) { |
28 | try { |
29 | [myObject privateMethod]; |
30 | [myObject privateMethod1]; |
31 | getMe = bar(myObject); // expected-error {{cannot refer to a non-static member from the handler of a constructor function try block}} |
32 | [CObj privateMethod1]; // expected-error {{cannot refer to a non-static member from the handler of a constructor function try block}} |
33 | } catch(int ei) { |
34 | i = ei; // expected-error {{cannot refer to a non-static member from the handler of a constructor function try block}} |
35 | } catch(...) { |
36 | { |
37 | i = 0; // expected-error {{cannot refer to a non-static member from the handler of a constructor function try block}} |
38 | } |
39 | } |
40 | } |
41 | |
42 | void BadReturn::MemFunc(MyClass * myObject) try { |
43 | } catch(...) { |
44 | try { |
45 | [myObject privateMethod]; |
46 | [myObject privateMethod1]; |
47 | getMe = bar(myObject); |
48 | [CObj privateMethod1]; |
49 | } catch(int ei) { |
50 | i = ei; |
51 | } catch(...) { |
52 | { |
53 | i = 0; |
54 | } |
55 | } |
56 | } |
57 | |
58 | - (void)privateMethod { } |
59 | |
60 | - (void)privateMethod1 { |
61 | getMe = getMe+1; |
62 | } |
63 | |
64 | static int getMe; |
65 | |
66 | @end |
67 | |