xref: /aosp_15_r20/external/clang/test/Analysis/blocks.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-checker=core -fblocks -analyzer-opt-analyze-nested-blocks -verify -x objective-c++ %s
2*67e74705SXin Li// RUN: %clang_cc1 -std=c++11 -fsyntax-only -analyze -analyzer-checker=core,debug.DumpCFG -fblocks -analyzer-opt-analyze-nested-blocks  %s > %t 2>&1
3*67e74705SXin Li// RUN: FileCheck --input-file=%t %s
4*67e74705SXin Li
5*67e74705SXin Li// expected-no-diagnostics
6*67e74705SXin Li
7*67e74705SXin Livoid testBlockWithoutCopyExpression(int i) {
8*67e74705SXin Li  // Captures i, with no copy expression.
9*67e74705SXin Li  (void)(^void() {
10*67e74705SXin Li    (void)i;
11*67e74705SXin Li  });
12*67e74705SXin Li}
13*67e74705SXin Li
14*67e74705SXin Li// CHECK-LABEL:void testBlockWithoutCopyExpression(int i)
15*67e74705SXin Li// CHECK-NEXT: [B2 (ENTRY)]
16*67e74705SXin Li// CHECK-NEXT:   Succs (1): B1
17*67e74705SXin Li
18*67e74705SXin Li// CHECK: [B1]
19*67e74705SXin Li// CHECK-NEXT:   1: ^{ }
20*67e74705SXin Li// CHECK-NEXT:   2: (void)([B1.1]) (CStyleCastExpr, ToVoid, void)
21*67e74705SXin Li// CHECK-NEXT:   Preds (1): B2
22*67e74705SXin Li// CHECK-NEXT:   Succs (1): B0
23*67e74705SXin Li
24*67e74705SXin Li// CHECK: [B0 (EXIT)]
25*67e74705SXin Li// CHECK-NEXT:   Preds (1): B1
26*67e74705SXin Li
27*67e74705SXin Listruct StructWithCopyConstructor {
28*67e74705SXin Li  StructWithCopyConstructor(int i);
29*67e74705SXin Li  StructWithCopyConstructor(const StructWithCopyConstructor &s);
30*67e74705SXin Li};
31*67e74705SXin Livoid testBlockWithCopyExpression(StructWithCopyConstructor s) {
32*67e74705SXin Li  // Captures s, with a copy expression calling the copy constructor for StructWithCopyConstructor.
33*67e74705SXin Li  (void)(^void() {
34*67e74705SXin Li    (void)s;
35*67e74705SXin Li  });
36*67e74705SXin Li}
37*67e74705SXin Li
38*67e74705SXin Li// CHECK-LABEL:void testBlockWithCopyExpression(StructWithCopyConstructor s)
39*67e74705SXin Li// CHECK-NEXT: [B2 (ENTRY)]
40*67e74705SXin Li// CHECK-NEXT:   Succs (1): B1
41*67e74705SXin Li
42*67e74705SXin Li// CHECK: [B1]
43*67e74705SXin Li// CHECK-NEXT:   1: s
44*67e74705SXin Li// CHECK-NEXT:   2: [B1.1] (CXXConstructExpr, const struct StructWithCopyConstructor)
45*67e74705SXin Li// CHECK-NEXT:   3: ^{ }
46*67e74705SXin Li// CHECK-NEXT:   4: (void)([B1.3]) (CStyleCastExpr, ToVoid, void)
47*67e74705SXin Li// CHECK-NEXT:   Preds (1): B2
48*67e74705SXin Li// CHECK-NEXT:   Succs (1): B0
49*67e74705SXin Li
50*67e74705SXin Li// CHECK: [B0 (EXIT)]
51*67e74705SXin Li// CHECK-NEXT:   Preds (1): B1
52*67e74705SXin Li
53*67e74705SXin Livoid testBlockWithCaptureByReference() {
54*67e74705SXin Li  __block StructWithCopyConstructor s(5);
55*67e74705SXin Li  // Captures s by reference, so no copy expression.
56*67e74705SXin Li  (void)(^void() {
57*67e74705SXin Li    (void)s;
58*67e74705SXin Li  });
59*67e74705SXin Li}
60*67e74705SXin Li
61*67e74705SXin Li// CHECK-LABEL:void testBlockWithCaptureByReference()
62*67e74705SXin Li// CHECK-NEXT: [B2 (ENTRY)]
63*67e74705SXin Li// CHECK-NEXT:   Succs (1): B1
64*67e74705SXin Li
65*67e74705SXin Li// CHECK: [B1]
66*67e74705SXin Li// CHECK-NEXT:   1: 5
67*67e74705SXin Li// CHECK-NEXT:   2: [B1.1] (CXXConstructExpr, struct StructWithCopyConstructor)
68*67e74705SXin Li// CHECK-NEXT:   3: StructWithCopyConstructor s(5) __attribute__((blocks("byref")));
69*67e74705SXin Li// CHECK-NEXT:   4: ^{ }
70*67e74705SXin Li// CHECK-NEXT:   5: (void)([B1.4]) (CStyleCastExpr, ToVoid, void)
71*67e74705SXin Li// CHECK-NEXT:   Preds (1): B2
72*67e74705SXin Li// CHECK-NEXT:   Succs (1): B0
73*67e74705SXin Li
74*67e74705SXin Li// CHECK: [B0 (EXIT)]
75*67e74705SXin Li// CHECK-NEXT:   Preds (1): B1
76