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. 16 int b[ [noreturn] ]; // expected-warning {{'noreturn' only applies to function types}} 17 18 int c[ [noreturn getSize] + 1 ]; 19 20 // An array size which is computed by a lambda is not OK. 21 int d[ [noreturn] { return 3; } () ]; // expected-error {{expected ']'}} expected-warning {{'noreturn' only applies}} 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 [[]]; 34 [[int(), noreturn]]; // expected-warning {{attribute noreturn cannot be specified on a statement}} 35 [[class, test(foo 'x' bar),,,]]; 36 [[bitand, noreturn]]; // expected-warning {{attribute noreturn cannot be specified on a statement}} 37 38 [[noreturn]]int(e)(); 39 int e2(); // expected-warning {{interpreted as a function declaration}} expected-note{{}} 40 41 // A function taking a noreturn function. 42 int(f)([[noreturn]] int()); // expected-note {{here}} 43 f(e); 44 f(e2); // expected-error {{cannot initialize a parameter of type 'int (*)() __attribute__((noreturn))' with an lvalue of type 'int ()'}} 45 46 // Variables initialized by a message send. 47 int(g)([[noreturn getSelf] getSize]); 48 int(h)([[noreturn]{return noreturn;}() getSize]); 49 50 int i = g + h; 51 } 52 53 template<typename...Ts> void f(Ts ...x) { 54 [[test::foo(bar, baz)...]]; 55 [[used(x)...]]; 56 [[x...] { return [ X alloc ]; }() init]; 57 } 58