// RUN: %clang_cc1 -triple arm64-apple-ios11 -fobjc-arc -fblocks -fobjc-runtime=ios-11.0 -fsyntax-only -verify %s typedef struct { id a; } Strong; void callee_variadic(const char *, ...); void test_variadic(void) { Strong t; callee_variadic("s", t); // expected-error {{cannot pass non-trivial C object of type 'Strong' by value to variadic function}} } void test_jump0(int cond) { switch (cond) { case 0: ; Strong x; // expected-note {{jump bypasses initialization of variable of non-trivial C struct type}} break; case 1: // expected-error {{cannot jump from switch statement to this case label}} x.a = 0; break; } } void test_jump1(void) { static void *ips[] = { &&L0 }; L0: // expected-note {{possible target of indirect goto}} ; Strong x; // expected-note {{jump exits scope of variable with non-trivial destructor}} goto *ips; // expected-error {{cannot jump}} } typedef void (^BlockTy)(void); void func(BlockTy); void func2(Strong); void test_block_scope0(int cond) { Strong x; // expected-note {{jump enters lifetime of block which captures a C struct that is non-trivial to destroy}} switch (cond) { case 0: func(^{ func2(x); }); break; default: // expected-error {{cannot jump from switch statement to this case label}} break; } } void test_block_scope1(void) { static void *ips[] = { &&L0 }; L0: // expected-note {{possible target of indirect goto}} ; Strong x; // expected-note {{jump exits scope of variable with non-trivial destructor}} expected-note {{jump exits lifetime of block which captures a C struct that is non-trivial to destroy}} func(^{ func2(x); }); goto *ips; // expected-error {{cannot jump}} } |