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