Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s -fblocks -std=c++1y
      2 
      3 extern "C" int exit(int);
      4 
      5 typedef struct {
      6     unsigned long ps[30];
      7     int qs[30];
      8 } BobTheStruct;
      9 
     10 int main (int argc, const char * argv[]) {
     11     BobTheStruct inny;
     12     BobTheStruct outty;
     13     BobTheStruct (^copyStruct)(BobTheStruct);
     14     int i;
     15 
     16     for(i=0; i<30; i++) {
     17         inny.ps[i] = i * i * i;
     18         inny.qs[i] = -i * i * i;
     19     }
     20 
     21     copyStruct = ^(BobTheStruct aBigStruct){ return aBigStruct; };  // pass-by-value intrinsically copies the argument
     22 
     23     outty = copyStruct(inny);
     24 
     25     if ( &inny == &outty ) {
     26         exit(1);
     27     }
     28     for(i=0; i<30; i++) {
     29         if ( (inny.ps[i] != outty.ps[i]) || (inny.qs[i] != outty.qs[i]) ) {
     30             exit(1);
     31         }
     32     }
     33 
     34     return 0;
     35 }
     36 
     37 namespace rdar8134521 {
     38   void foo() {
     39     int (^P)(int) = reinterpret_cast<int(^)(int)>(1);
     40     P = (int(^)(int))(1);
     41 
     42     P = reinterpret_cast<int(^)(int)>((void*)1);
     43     P = (int(^)(int))((void*)1);
     44   }
     45 }
     46 
     47 namespace rdar11055105 {
     48   struct A {
     49     void foo();
     50   };
     51 
     52   template <class T> void foo(T &x) noexcept(noexcept(x.foo()));
     53 
     54   void (^block)() = ^{
     55     A a;
     56     foo(a);
     57   };
     58 }
     59 
     60 namespace LocalDecls {
     61   void f() {
     62     (void) ^{
     63       extern int a; // expected-note {{previous}}
     64       extern int b(); // expected-note {{previous}}
     65     };
     66   }
     67   void g() {
     68     (void) ^{
     69       extern float a; // expected-error {{different type}}
     70       extern float b(); // expected-error {{cannot be overloaded}}
     71     };
     72   }
     73 }
     74