|  | // 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:; | 
|  | }); | 
|  | } |