Richard Smith | 6ee326a | 2012-04-10 01:32:12 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s |
| 2 | |
| 3 | @interface X {} |
| 4 | + (X*) alloc; |
| 5 | - (X*) init; |
| 6 | - (int) getSize; |
| 7 | - (void) setSize: (int) size; |
| 8 | - (X*) getSelf; |
| 9 | @end |
| 10 | |
| 11 | void f(X *noreturn) { |
| 12 | // An array size which is computed by a message send is OK. |
| 13 | int a[ [noreturn getSize] ]; |
| 14 | |
| 15 | // ... but is interpreted as an attribute where possible. |
Stephen Hines | 651f13c | 2014-04-23 16:59:28 -0700 | [diff] [blame] | 16 | int b[ [noreturn] ]; // expected-error {{'noreturn' attribute only applies to functions}} |
Richard Smith | 6ee326a | 2012-04-10 01:32:12 +0000 | [diff] [blame] | 17 | |
| 18 | int c[ [noreturn getSize] + 1 ]; |
| 19 | |
| 20 | // An array size which is computed by a lambda is not OK. |
Stephen Hines | 651f13c | 2014-04-23 16:59:28 -0700 | [diff] [blame] | 21 | int d[ [noreturn] { return 3; } () ]; // expected-error {{expected ']'}} expected-error {{'noreturn' attribute only applies to functions}} |
Richard Smith | 6ee326a | 2012-04-10 01:32:12 +0000 | [diff] [blame] | 22 | |
| 23 | // A message send which contains a message send is OK. |
| 24 | [ [ X alloc ] init ]; |
| 25 | [ [ int(), noreturn getSelf ] getSize ]; // expected-warning {{unused}} |
| 26 | |
| 27 | // A message send which contains a lambda is OK. |
| 28 | [ [noreturn] { return noreturn; } () setSize: 4 ]; |
| 29 | [ [bitand] { return noreturn; } () setSize: 5 ]; |
| 30 | [[[[] { return [ X alloc ]; } () init] getSelf] getSize]; |
| 31 | |
| 32 | // An attribute is OK. |
| 33 | [[]]; |
Michael Han | 6880f49 | 2012-10-03 01:56:22 +0000 | [diff] [blame] | 34 | [[int(), noreturn]]; // expected-warning {{unknown attribute 'int' ignored}} \ |
Richard Smith | 0532140 | 2013-02-19 23:47:15 +0000 | [diff] [blame] | 35 | // expected-error {{'noreturn' attribute cannot be applied to a statement}} |
Michael Han | 6880f49 | 2012-10-03 01:56:22 +0000 | [diff] [blame] | 36 | [[class, test(foo 'x' bar),,,]]; // expected-warning {{unknown attribute 'test' ignored}}\ |
| 37 | // expected-warning {{unknown attribute 'class' ignored}} |
| 38 | |
Richard Smith | 0532140 | 2013-02-19 23:47:15 +0000 | [diff] [blame] | 39 | [[bitand, noreturn]]; // expected-error {{'noreturn' attribute cannot be applied to a statement}} \ |
Michael Han | 6880f49 | 2012-10-03 01:56:22 +0000 | [diff] [blame] | 40 | expected-warning {{unknown attribute 'bitand' ignored}} |
Richard Smith | 6ce48a7 | 2012-04-11 04:01:28 +0000 | [diff] [blame] | 41 | |
Richard Smith | b9c6261 | 2012-07-30 21:30:52 +0000 | [diff] [blame] | 42 | // FIXME: Suppress vexing parse warning |
Richard Smith | cd8ab51 | 2013-01-17 01:30:42 +0000 | [diff] [blame] | 43 | [[gnu::noreturn]]int(e)(); // expected-warning {{function declaration}} expected-note {{replace parentheses with an initializer}} |
Richard Smith | 534986f | 2012-04-14 00:33:13 +0000 | [diff] [blame] | 44 | int e2(); // expected-warning {{interpreted as a function declaration}} expected-note{{}} |
Richard Smith | 6ce48a7 | 2012-04-11 04:01:28 +0000 | [diff] [blame] | 45 | |
| 46 | // A function taking a noreturn function. |
Richard Smith | 5c52166 | 2013-01-15 02:48:13 +0000 | [diff] [blame] | 47 | int(f)([[gnu::noreturn]] int ()); // expected-note {{here}} |
Richard Smith | 6ce48a7 | 2012-04-11 04:01:28 +0000 | [diff] [blame] | 48 | f(e); |
Richard Smith | 534986f | 2012-04-14 00:33:13 +0000 | [diff] [blame] | 49 | f(e2); // expected-error {{cannot initialize a parameter of type 'int (*)() __attribute__((noreturn))' with an lvalue of type 'int ()'}} |
Richard Smith | 6ce48a7 | 2012-04-11 04:01:28 +0000 | [diff] [blame] | 50 | |
| 51 | // Variables initialized by a message send. |
| 52 | int(g)([[noreturn getSelf] getSize]); |
| 53 | int(h)([[noreturn]{return noreturn;}() getSize]); |
| 54 | |
| 55 | int i = g + h; |
Richard Smith | 6ee326a | 2012-04-10 01:32:12 +0000 | [diff] [blame] | 56 | } |
| 57 | |
| 58 | template<typename...Ts> void f(Ts ...x) { |
Michael Han | 6880f49 | 2012-10-03 01:56:22 +0000 | [diff] [blame] | 59 | [[test::foo(bar, baz)...]]; // expected-error {{attribute 'foo' cannot be used as an attribute pack}} \ |
| 60 | // expected-warning {{unknown attribute 'foo' ignored}} |
| 61 | |
| 62 | [[used(x)...]]; // expected-error {{attribute 'used' cannot be used as an attribute pack}} \ |
| 63 | // expected-warning {{unknown attribute 'used' ignored}} |
| 64 | |
Richard Smith | 6ee326a | 2012-04-10 01:32:12 +0000 | [diff] [blame] | 65 | [[x...] { return [ X alloc ]; }() init]; |
| 66 | } |