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