| // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -std=c++11 -Wuninitialized -verify %s |
| |
| // test1: Expect no diagnostics |
| int test1(int x) { |
| int y; |
| asm goto("nop" : "=r"(y) : "r"(x) : : err); |
| return y; |
| err: |
| return -1; |
| } |
| |
| int test2(int x) { |
| int y; // expected-warning {{variable 'y' is used uninitialized whenever its declaration is reached}} \ |
| // expected-note {{initialize the variable}} |
| if (x < 42) |
| asm volatile goto("testl %0, %0; testl %1, %2; jne %l3" : "+S"(x), "+D"(y) : "r"(x) :: indirect_1, indirect_2); |
| else |
| asm volatile goto("testl %0, %1; testl %2, %3; jne %l5" : "+S"(x), "+D"(y) : "r"(x), "r"(y) :: indirect_1, indirect_2); |
| return x + y; |
| indirect_1: |
| return -42; |
| indirect_2: |
| return y; // expected-note {{uninitialized use occurs here}} |
| } |
| |
| int test3(int x) { |
| int y; // expected-warning {{variable 'y' is used uninitialized whenever its declaration is reached}} \ |
| // expected-note {{initialize the variable}} |
| asm goto("xorl %1, %0; jmp %l2" : "=&r"(y) : "r"(x) : : fail); |
| normal: |
| y += x; |
| return y; |
| if (x) { |
| fail: |
| return y; // expected-note {{uninitialized use occurs here}} |
| } |
| return 0; |
| } |
| |
| int test4(int x) { |
| int y; // expected-warning {{variable 'y' is used uninitialized whenever its declaration is reached}} \ |
| // expected-note {{initialize the variable}} |
| goto forward; |
| backward: |
| return y; // expected-note {{uninitialized use occurs here}} |
| forward: |
| asm goto("# %0 %1 %2" : "=r"(y) : "r"(x) : : backward); |
| return y; |
| } |
| |
| // test5: Expect no diagnostics |
| int test5(int x) { |
| int y; |
| asm volatile goto("testl %0, %0; testl %1, %2; jne %l3" : "+S"(x), "+D"(y) : "r"(x) :: indirect, fallthrough); |
| fallthrough: |
| return y; |
| indirect: |
| return -2; |
| } |