Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -Wglobal-constructors %s -verify
      2 
      3 int opaque_int();
      4 
      5 namespace 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 
     19 namespace 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 
     32 namespace 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 
     43 namespace 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 
     54 namespace test4 {
     55   char a[] = "hello";
     56   char b[6] = "hello";
     57   char c[][6] = { "hello" };
     58 }
     59 
     60 namespace 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 
     71 namespace 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 
     82 namespace 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 
     99 namespace referencemember {
    100   struct A { int &a; };
    101   int a;
    102   A b = { a };
    103 }
    104 
    105 namespace 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 
    124 namespace pr20420 {
    125 // No warning is expected. This used to crash.
    126 void *array_storage[1];
    127 const int &global_reference = *(int *)array_storage;
    128 }
    129