Home | History | Annotate | Download | only in SemaObjCXX
      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