forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			60 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
| // 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;
 | |
| }
 |