55 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: clang-reorder-fields -record-name bar::Foo -fields-order y,z,c,x %s -- 2>&1 | FileCheck --check-prefix=CHECK-MESSAGES %s
 | |
| // FIXME: clang-reorder-fields should provide -verify mode to make writing these checks
 | |
| // easier and more accurate, for now we follow clang-tidy's approach.
 | |
| 
 | |
| namespace bar {
 | |
| 
 | |
| struct Dummy {
 | |
|   Dummy(int x, char c) : x(x), c(c) {}
 | |
|   int x;
 | |
|   char c;
 | |
| };
 | |
| 
 | |
| class Foo {
 | |
| public:
 | |
|   Foo(int x, double y, char cin);
 | |
|   Foo(int nx);
 | |
|   Foo();
 | |
|   int x;
 | |
|   double y;
 | |
|   char c;
 | |
|   Dummy z;
 | |
| };
 | |
| 
 | |
| static char bar(char c) {
 | |
|   return c + 1;
 | |
| }
 | |
| 
 | |
| Foo::Foo() : x(), y(), c(), z(0, 'a') {}
 | |
| 
 | |
| Foo::Foo(int x, double y, char cin) :  
 | |
|   x(x),                 
 | |
|   y(y),                 
 | |
|   c(cin),               
 | |
|   z(this->x, bar(c))    
 | |
|   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: reordering field x after z makes x uninitialized when used in init expression
 | |
|   // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: reordering field c after z makes c uninitialized when used in init expression
 | |
| {}
 | |
| 
 | |
| Foo::Foo(int nx) :
 | |
|   x(nx),              
 | |
|   y(x),
 | |
|   c(0),            
 | |
|   z(bar(bar(x)), c)     
 | |
|   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: reordering field x after y makes x uninitialized when used in init expression
 | |
|   // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: reordering field x after z makes x uninitialized when used in init expression
 | |
|   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: reordering field c after z makes c uninitialized when used in init expression
 | |
| {}
 | |
| 
 | |
| } // namespace bar
 | |
| 
 | |
| int main() {
 | |
|   bar::Foo F(5, 12.8, 'c');
 | |
|   return 0;
 | |
| }
 |