// RUN: %clang_cc1 %s -triple i386-pc-linux-gnu -verify -fsyntax-only // RUN: %clang_cc1 %s -triple x86_64-pc-linux-gnu -verify -fsyntax-only struct S { ~S(); int f(int); private: int k; }; void test1(int n) { // expected-error@+1 {{cannot jump from this goto statement to its label}} goto DirectJump; // expected-note@+1 {{jump bypasses variable with a non-trivial destructor}} S s1; DirectJump: // expected-error@+1 {{cannot jump from this asm goto statement to one of its possible targets}} asm goto("jmp %l0;" ::::Later); // expected-note@+1 {{jump bypasses variable with a non-trivial destructor}} S s2; // expected-note@+1 {{possible target of asm goto statement}} Later: return; } struct T { ~T(); }; void test2(int a) { if (a) { FOO: // expected-note@+2 {{jump exits scope of variable with non-trivial destructor}} // expected-note@+1 {{jump exits scope of variable with non-trivial destructor}} T t; void *p = &&BAR; // expected-error@+1 {{cannot jump from this asm goto statement to one of its possible targets}} asm goto("jmp %l0;" ::::BAR); // expected-error@+1 {{cannot jump from this indirect goto statement to one of its possible targets}} goto *p; p = &&FOO; goto *p; return; } // expected-note@+2 {{possible target of asm goto statement}} // expected-note@+1 {{possible target of indirect goto statement}} BAR: return; } int test3(int n) { // expected-error@+2 {{cannot jump from this asm goto statement to one of its possible targets}} // expected-error@+1 {{cannot jump from this asm goto statement to one of its possible targets}} asm volatile goto("testl %0, %0; jne %l1;" :: "r"(n)::label_true, loop); // expected-note@+3 {{jump bypasses initialization of variable length array}} // expected-note@+2 {{possible target of asm goto statement}} // expected-note@+1 {{jump enters a statement expression}} return ({int a[n];label_true: 2;}); // expected-note@+1 {{jump bypasses initialization of variable length array}} int b[n]; // expected-note@+1 {{possible target of asm goto statement}} loop: return 0; } void test4cleanup(int*); // No errors expected. void test4(void) { asm goto(""::::l0); l0:; int x __attribute__((cleanup(test4cleanup))); asm goto(""::::l1); l1:; } void statement_expressions() { ({ __label__ label; asm goto("" : : : : label); label:; }); ({ __label__ label; asm goto("" : : : : label); label:; }); }