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