| // RUN: %clang_cc1 -fsyntax-only -verify -fobjc-exceptions %s |
| // RUN: %clang_cc1 -fsyntax-only -verify -fobjc-exceptions -x objective-c++ %s |
| void * proc(); |
| |
| @interface NSConstantString |
| @end |
| |
| @interface Frob |
| @end |
| |
| @interface Frob1 |
| @end |
| |
| void * foo() |
| { |
| @try { |
| return proc(); |
| } |
| @catch (Frob* ex) { |
| @throw; |
| } |
| @catch (Frob1* ex) { |
| @throw proc(); |
| } |
| @finally { |
| @try { |
| return proc(); |
| } |
| @catch (Frob* ex) { |
| @throw 1,2; // expected-error {{@throw requires an Objective-C object type ('int' invalid)}} \ |
| // expected-warning {{expression result unused}} |
| } |
| @catch (float x) { // expected-error {{@catch parameter is not a pointer to an interface type}} |
| |
| } |
| @catch(...) { |
| @throw (4,3,proc()); // expected-warning {{expression result unused}} \ |
| // expected-warning {{expression result unused}} |
| } |
| } |
| |
| @try { // expected-error {{@try statement without a @catch and @finally clause}} |
| return proc(); |
| } |
| } |
| |
| |
| void bar() |
| { |
| @try {}// expected-error {{@try statement without a @catch and @finally clause}} |
| @"s"; // expected-warning {{result unused}} |
| } |
| |
| void baz() |
| { |
| @try {}// expected-error {{@try statement without a @catch and @finally clause}} |
| @try {} |
| @finally {} |
| } |
| |
| void noTwoTokenLookAheadRequiresABitOfFancyFootworkInTheParser() { |
| @try { |
| // Do something |
| } @catch (...) {} |
| @try { |
| // Do something |
| } @catch (...) {} |
| return; |
| } |
| |