brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · 765654b Raw
168 lines · cpp
1// RUN: %clang_cc1 -std=c++11 -fsyntax-only -Wglobal-constructors %s -verify=expected,cxx112// RUN: %clang_cc1 -std=c++20 -fsyntax-only -Wglobal-constructors %s -verify=expected3 4int opaque_int();5 6namespace test0 {7  // These should never require global constructors.8  int a;9  int b = 20;10  float c = 5.0f;11 12  // This global constructor is avoidable based on initialization order.13  int d = b; // expected-warning {{global constructor}}14 15  // These global constructors are unavoidable.16  int e = opaque_int(); // expected-warning {{global constructor}}17  int f = b; // expected-warning {{global constructor}}18}19 20namespace test1 {21  struct A { int x; };22  A a;23  A b = A();24  A c = { 10 };25  A d = { opaque_int() }; // expected-warning {{global constructor}}26  A e = A(A());27  A f = A(a); // expected-warning {{global constructor}}28  A g(a); // expected-warning {{global constructor}}29  A h((A()));  // elided30  A i((A(A()))); // elided31}32 33namespace test2 {34  struct A { A(); };35  A a; // expected-warning {{global constructor}}36  A b[10]; // expected-warning {{global constructor}}37  A c[10][10]; // expected-warning {{global constructor}}38 39  A &d = a;40  A &e = b[5];41  A &f = c[5][7];42}43 44namespace test3 {45  struct A { ~A(); };46  A a; // expected-warning {{global destructor}}47  A b[10]; // expected-warning {{global destructor}}48  A c[10][10]; // expected-warning {{global destructor}}49 50  A &d = a;51  A &e = b[5];52  A &f = c[5][7];53}54 55namespace test4 {56  char a[] = "hello";57  char b[6] = "hello";58  char c[][6] = { "hello" };59}60 61namespace test5 {62  struct A { A(); };63 64  void f1() {65    static A a;66  }67  void f2() {68    static A& a = *new A;69  }70}71 72namespace test6 {73  struct A { ~A(); };74 75  void f1() {76    static A a;77  }78  void f2() {79    static A& a = *new A;80  }81}82 83namespace pr8095 {84  struct Foo {85    int x;86    Foo(int x1) : x(x1) {}87  };88  void foo() {89    static Foo a(0);90  }91 92  struct Bar {93    ~Bar();94  };95  void bar() {96    static Bar b;97  }98}99 100namespace referencemember {101  struct A { int &a; };102  int a;103  A b = { a };104}105 106namespace pr19253 {107  struct A { ~A() = default; };108  A a;109 110  struct B { ~B(); };111  struct C : B { ~C() = default; };112  C c; // expected-warning {{global destructor}}113 114  class D {115    friend struct E;116    ~D() = default;117  };118  struct E : D {119    D d;120    ~E() = default;121  };122  E e;123}124 125namespace pr20420 {126// No warning is expected. This used to crash.127void *array_storage[1];128const int &global_reference = *(int *)array_storage;129}130 131namespace bitfields {132  struct HasUnnamedBitfield {133    unsigned a;134    unsigned : 20;135    unsigned b;136 137    constexpr HasUnnamedBitfield() : a(), b() {}138    constexpr HasUnnamedBitfield(unsigned a, unsigned b) : a(a), b(b) {}139    explicit HasUnnamedBitfield(unsigned a) {}140  };141 142  const HasUnnamedBitfield zeroConst{};143  HasUnnamedBitfield zeroMutable{};144  const HasUnnamedBitfield explicitConst{1, 2};145  HasUnnamedBitfield explicitMutable{1, 2};146  const HasUnnamedBitfield nonConstexprConst{1}; // expected-warning {{global constructor}}147  HasUnnamedBitfield nonConstexprMutable{1}; // expected-warning {{global constructor}}148}149 150namespace test7 {151#if __cplusplus >= 202002L152#define CPP20_CONSTEXPR constexpr153#else154#define CPP20_CONSTEXPR155#endif156  struct S {157    CPP20_CONSTEXPR ~S() {}158  };159  S s; // cxx11-warning {{global destructor}}160 161  struct T {162    CPP20_CONSTEXPR ~T() { if (b) {} }163    bool b;164  };165  T t; // expected-warning {{global destructor}}166#undef CPP20_CONSTEXPR167}168