1// RUN: %clang_cc1 -x objective-c++ -fblocks -triple x86_64-apple-darwin -fobjc-runtime=macosx-fragile-10.5 %s -verify -std=c++11 -emit-llvm -o %t 2// rdar://8979379 3 4@interface A 5@end 6 7@interface B : A 8@end 9 10void f(int (^bl)(B* b)); 11void takeBlock(void (^block)()); 12void useValues(...); 13 14// Test1 15void g() { 16 f(^(A* a) { return 0; }); 17} 18 19// Test2 20void g1() { 21 int (^bl)(B* b) = ^(A* a) { return 0; }; 22} 23 24// Test3 25@protocol NSObject; 26 27void bar(id(^)(void)); 28 29void foo(id <NSObject>(^objectCreationBlock)(void)) { 30 return bar(objectCreationBlock); 31} 32 33// Test4 34struct S { 35 S *(^a)() = ^{ 36 return this; 37 }; 38}; 39S s; 40 41// Test5 42struct X { 43 void f() { 44 ^ { 45 struct Nested { Nested *ptr = this; }; 46 } (); 47 }; 48}; 49 50// Regression test for PR13314 51class FooClass { }; 52void fun() { 53 FooClass foovar; 54 ^() { // expected-warning {{expression result unused}} 55 return foovar; 56 }; 57} 58void gun() { 59 FooClass foovar; 60 [=]() { // expected-warning {{expression result unused}} 61 return foovar; 62 }; 63} 64 65// PR24780 66class CaptureThisAndAnotherPointer { 67 void test(void *ptr) { 68 takeBlock(^{ useValues(ptr, this); }); 69 } 70}; 71 72// rdar://problem/23713871 73// Check that we don't crash when using BLOCK_LAYOUT_STRONG. 74#pragma clang assume_nonnull begin 75@interface NSUUID @end 76#pragma clang assume_nonnull end 77 78struct Wrapper1 { NSUUID *Ref; }; 79struct Wrapper2 { Wrapper1 W1; }; 80 81@implementation B 82- (void) captureStrongRef { 83 __block Wrapper2 W2; 84} 85@end 86