xref: /aosp_15_r20/external/clang/test/SemaCXX/warn-global-constructors.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fsyntax-only -Wglobal-constructors %s -verify
2*67e74705SXin Li 
3*67e74705SXin Li int opaque_int();
4*67e74705SXin Li 
5*67e74705SXin Li namespace test0 {
6*67e74705SXin Li   // These should never require global constructors.
7*67e74705SXin Li   int a;
8*67e74705SXin Li   int b = 20;
9*67e74705SXin Li   float c = 5.0f;
10*67e74705SXin Li 
11*67e74705SXin Li   // This global constructor is avoidable based on initialization order.
12*67e74705SXin Li   int d = b; // expected-warning {{global constructor}}
13*67e74705SXin Li 
14*67e74705SXin Li   // These global constructors are unavoidable.
15*67e74705SXin Li   int e = opaque_int(); // expected-warning {{global constructor}}
16*67e74705SXin Li   int f = b; // expected-warning {{global constructor}}
17*67e74705SXin Li }
18*67e74705SXin Li 
19*67e74705SXin Li namespace test1 {
20*67e74705SXin Li   struct A { int x; };
21*67e74705SXin Li   A a;
22*67e74705SXin Li   A b = A();
23*67e74705SXin Li   A c = { 10 };
24*67e74705SXin Li   A d = { opaque_int() }; // expected-warning {{global constructor}}
25*67e74705SXin Li   A e = A(A());
26*67e74705SXin Li   A f = A(a); // expected-warning {{global constructor}}
27*67e74705SXin Li   A g(a); // expected-warning {{global constructor}}
28*67e74705SXin Li   A h((A()));  // elided
29*67e74705SXin Li   A i((A(A()))); // elided
30*67e74705SXin Li }
31*67e74705SXin Li 
32*67e74705SXin Li namespace test2 {
33*67e74705SXin Li   struct A { A(); };
34*67e74705SXin Li   A a; // expected-warning {{global constructor}}
35*67e74705SXin Li   A b[10]; // expected-warning {{global constructor}}
36*67e74705SXin Li   A c[10][10]; // expected-warning {{global constructor}}
37*67e74705SXin Li 
38*67e74705SXin Li   A &d = a;
39*67e74705SXin Li   A &e = b[5];
40*67e74705SXin Li   A &f = c[5][7];
41*67e74705SXin Li }
42*67e74705SXin Li 
43*67e74705SXin Li namespace test3 {
44*67e74705SXin Li   struct A { ~A(); };
45*67e74705SXin Li   A a; // expected-warning {{global destructor}}
46*67e74705SXin Li   A b[10]; // expected-warning {{global destructor}}
47*67e74705SXin Li   A c[10][10]; // expected-warning {{global destructor}}
48*67e74705SXin Li 
49*67e74705SXin Li   A &d = a;
50*67e74705SXin Li   A &e = b[5];
51*67e74705SXin Li   A &f = c[5][7];
52*67e74705SXin Li }
53*67e74705SXin Li 
54*67e74705SXin Li namespace test4 {
55*67e74705SXin Li   char a[] = "hello";
56*67e74705SXin Li   char b[6] = "hello";
57*67e74705SXin Li   char c[][6] = { "hello" };
58*67e74705SXin Li }
59*67e74705SXin Li 
60*67e74705SXin Li namespace test5 {
61*67e74705SXin Li   struct A { A(); };
62*67e74705SXin Li 
f1()63*67e74705SXin Li   void f1() {
64*67e74705SXin Li     static A a;
65*67e74705SXin Li   }
f2()66*67e74705SXin Li   void f2() {
67*67e74705SXin Li     static A& a = *new A;
68*67e74705SXin Li   }
69*67e74705SXin Li }
70*67e74705SXin Li 
71*67e74705SXin Li namespace test6 {
72*67e74705SXin Li   struct A { ~A(); };
73*67e74705SXin Li 
f1()74*67e74705SXin Li   void f1() {
75*67e74705SXin Li     static A a;
76*67e74705SXin Li   }
f2()77*67e74705SXin Li   void f2() {
78*67e74705SXin Li     static A& a = *new A;
79*67e74705SXin Li   }
80*67e74705SXin Li }
81*67e74705SXin Li 
82*67e74705SXin Li namespace pr8095 {
83*67e74705SXin Li   struct Foo {
84*67e74705SXin Li     int x;
Foopr8095::Foo85*67e74705SXin Li     Foo(int x1) : x(x1) {}
86*67e74705SXin Li   };
foo()87*67e74705SXin Li   void foo() {
88*67e74705SXin Li     static Foo a(0);
89*67e74705SXin Li   }
90*67e74705SXin Li 
91*67e74705SXin Li   struct Bar {
92*67e74705SXin Li     ~Bar();
93*67e74705SXin Li   };
bar()94*67e74705SXin Li   void bar() {
95*67e74705SXin Li     static Bar b;
96*67e74705SXin Li   }
97*67e74705SXin Li }
98*67e74705SXin Li 
99*67e74705SXin Li namespace referencemember {
100*67e74705SXin Li   struct A { int &a; };
101*67e74705SXin Li   int a;
102*67e74705SXin Li   A b = { a };
103*67e74705SXin Li }
104*67e74705SXin Li 
105*67e74705SXin Li namespace pr19253 {
106*67e74705SXin Li   struct A { ~A() = default; };
107*67e74705SXin Li   A a;
108*67e74705SXin Li 
109*67e74705SXin Li   struct B { ~B(); };
110*67e74705SXin Li   struct C : B { ~C() = default; };
111*67e74705SXin Li   C c; // expected-warning {{global destructor}}
112*67e74705SXin Li 
113*67e74705SXin Li   class D {
114*67e74705SXin Li     friend struct E;
115*67e74705SXin Li     ~D() = default;
116*67e74705SXin Li   };
117*67e74705SXin Li   struct E : D {
118*67e74705SXin Li     D d;
119*67e74705SXin Li     ~E() = default;
120*67e74705SXin Li   };
121*67e74705SXin Li   E e;
122*67e74705SXin Li }
123*67e74705SXin Li 
124*67e74705SXin Li namespace pr20420 {
125*67e74705SXin Li // No warning is expected. This used to crash.
126*67e74705SXin Li void *array_storage[1];
127*67e74705SXin Li const int &global_reference = *(int *)array_storage;
128*67e74705SXin Li }
129