| // RUN: %clang_cc1 -verify %s \ |
| // RUN: -fblocks -fobjc-exceptions -fexceptions -fsyntax-only \ |
| // RUN: -Wno-unused-value -Wno-unused-getter-return-value |
| |
| #if !__has_extension(statement_attributes_with_gnu_syntax) |
| #error "We should have statement attributes with GNU syntax support" |
| #endif |
| |
| @interface Base |
| @end |
| |
| @interface Test : Base |
| @property(getter=hasFoobar) int foobar; |
| - (void)foo; |
| - (void)bar; |
| @end |
| |
| Test *getTest(); |
| |
| @implementation Test |
| - (void)foo __attribute__((nomerge)) { |
| // expected-error@-1 {{'nomerge' attribute only applies to functions and statements}} |
| } |
| |
| - (void)bar { |
| __attribute__(()) [self foo]; |
| // expected-error@-1 {{missing '[' at start of message send expression}} |
| // expected-error@-2 {{expected ']'}} |
| // expected-error@-3 {{expected identifier or '('}} |
| // expected-note@-4 {{to match this '['}} |
| __attribute__((nomerge)) [self foo]; |
| // expected-warning@-1 {{nomerge attribute is ignored because there exists no call expression inside the statement}} |
| __attribute__((nomerge)) [getTest() foo]; |
| |
| __attribute__(()) ^{}; |
| // expected-error@-1 {{expected identifier or '('}} |
| __attribute__((nomerge)) ^{}; |
| // expected-warning@-1 {{nomerge attribute is ignored because there exists no call expression inside the statement}} |
| __attribute__((nomerge)) ^{ [self foo]; }(); |
| |
| __attribute__(()) @try { |
| [self foo]; |
| } @finally { |
| } |
| |
| __attribute__((nomerge)) @try { |
| [getTest() foo]; |
| } @finally { |
| } |
| |
| __attribute__((nomerge)) (__bridge void *)self; |
| // expected-warning@-1 {{nomerge attribute is ignored because there exists no call expression inside the statement}} |
| |
| __attribute__((nomerge)) self.hasFoobar; |
| // expected-warning@-1 {{nomerge attribute is ignored because there exists no call expression inside the statement}} |
| } |
| @end |