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