| // 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@+2 {{jump bypasses initialization of variable length array}} |
| // expected-note@+1 {{possible target of asm goto statement}} |
| 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; |
| } |