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