Home | History | Annotate | Download | only in Parser
      1 // RUN: %clang_cc1 -fsyntax-only -Wno-unused-value -verify -std=c++11 %s
      2 
      3 enum E { e };
      4 
      5 class C {
      6 
      7   int f() {
      8     int foo, bar;
      9 
     10     []; // expected-error {{expected body of lambda expression}}
     11     [+] {}; // expected-error {{expected variable name or 'this' in lambda capture list}}
     12     [foo+] {}; // expected-error {{expected ',' or ']' in lambda capture list}}
     13     [foo,&this] {}; // expected-error {{'this' cannot be captured by reference}}
     14     [&this] {}; // expected-error {{'this' cannot be captured by reference}}
     15     [&,] {}; // expected-error {{expected variable name or 'this' in lambda capture list}}
     16     [=,] {}; // expected-error {{expected variable name or 'this' in lambda capture list}}
     17     [] {};
     18     [=] (int i) {};
     19     [&] (int) mutable -> void {};
     20     [foo,bar] () { return 3; };
     21     [=,&foo] () {};
     22     [&,foo] () {};
     23     [this] () {};
     24     [] () -> class C { return C(); };
     25     [] () -> enum E { return e; };
     26 
     27     [] -> int { return 0; }; // expected-error{{lambda requires '()' before return type}}
     28     [] mutable -> int { return 0; }; // expected-error{{lambda requires '()' before 'mutable'}}
     29     [](int) -> {}; // PR13652 expected-error {{expected a type}}
     30     return 1;
     31   }
     32 
     33   void designator_or_lambda() {
     34     typedef int T;
     35     const int b = 0;
     36     const int c = 1;
     37     int a1[1] = {[b] (T()) {}}; // expected-error{{no viable conversion from '<lambda}}
     38     int a2[1] = {[b] = 1 };
     39     int a3[1] = {[b,c] = 1 }; // expected-error{{expected body of lambda expression}}
     40     int a4[1] = {[&b] = 1 }; // expected-error{{integral constant expression must have integral or unscoped enumeration type, not 'const int *'}}
     41     int a5[3] = { []{return 0;}() };
     42     int a6[1] = {[this] = 1 }; // expected-error{{integral constant expression must have integral or unscoped enumeration type, not 'C *'}}
     43   }
     44 
     45   void delete_lambda(int *p) {
     46     delete [] p;
     47     delete [] (int*) { new int }; // ok, compound-literal, not lambda
     48     delete [] { return new int; } (); // expected-error{{expected expression}}
     49     delete [&] { return new int; } (); // ok, lambda
     50   }
     51 };
     52