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