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