104 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // RUN: %clang_cc1 -fsyntax-only -Wglobal-constructors %s -verify
 | |
| 
 | |
| int opaque_int();
 | |
| 
 | |
| namespace test0 {
 | |
|   // These should never require global constructors.
 | |
|   int a;
 | |
|   int b = 20;
 | |
|   float c = 5.0f;
 | |
| 
 | |
|   // This global constructor is avoidable based on initialization order.
 | |
|   int d = b; // expected-warning {{global constructor}}
 | |
| 
 | |
|   // These global constructors are unavoidable.
 | |
|   int e = opaque_int(); // expected-warning {{global constructor}}
 | |
|   int f = b; // expected-warning {{global constructor}}
 | |
| }
 | |
| 
 | |
| namespace test1 {
 | |
|   struct A { int x; };
 | |
|   A a;
 | |
|   A b = A();
 | |
|   A c = { 10 };
 | |
|   A d = { opaque_int() }; // expected-warning {{global constructor}}
 | |
|   A e = A(A());
 | |
|   A f = A(a); // expected-warning {{global constructor}}
 | |
|   A g(a); // expected-warning {{global constructor}}
 | |
|   A h((A()));  // elided
 | |
|   A i((A(A()))); // elided
 | |
| }
 | |
| 
 | |
| namespace test2 {
 | |
|   struct A { A(); };
 | |
|   A a; // expected-warning {{global constructor}}
 | |
|   A b[10]; // expected-warning {{global constructor}}
 | |
|   A c[10][10]; // expected-warning {{global constructor}}
 | |
| 
 | |
|   A &d = a;
 | |
|   A &e = b[5];
 | |
|   A &f = c[5][7];
 | |
| }
 | |
| 
 | |
| namespace test3 {
 | |
|   struct A { ~A(); };
 | |
|   A a; // expected-warning {{global destructor}}
 | |
|   A b[10]; // expected-warning {{global destructor}}
 | |
|   A c[10][10]; // expected-warning {{global destructor}}
 | |
| 
 | |
|   A &d = a;
 | |
|   A &e = b[5];
 | |
|   A &f = c[5][7];
 | |
| }
 | |
| 
 | |
| namespace test4 {
 | |
|   char a[] = "hello";
 | |
|   char b[6] = "hello";
 | |
|   char c[][6] = { "hello" };
 | |
| }
 | |
| 
 | |
| namespace test5 {
 | |
|   struct A { A(); };
 | |
| 
 | |
|   void f1() {
 | |
|     static A a;
 | |
|   }
 | |
|   void f2() {
 | |
|     static A& a = *new A;
 | |
|   }
 | |
| }
 | |
| 
 | |
| namespace test6 {
 | |
|   struct A { ~A(); };
 | |
| 
 | |
|   void f1() {
 | |
|     static A a;
 | |
|   }
 | |
|   void f2() {
 | |
|     static A& a = *new A;
 | |
|   }
 | |
| }
 | |
| 
 | |
| namespace pr8095 {
 | |
|   struct Foo {
 | |
|     int x;
 | |
|     Foo(int x1) : x(x1) {}
 | |
|   };
 | |
|   void foo() {
 | |
|     static Foo a(0);
 | |
|   }
 | |
| 
 | |
|   struct Bar {
 | |
|     ~Bar();
 | |
|   };
 | |
|   void bar() {
 | |
|     static Bar b;
 | |
|   }
 | |
| }
 | |
| 
 | |
| namespace referencemember {
 | |
|   struct A { int &a; };
 | |
|   int a;
 | |
|   A b = { a };
 | |
| }
 | 
