// RUN: %check_clang_tidy %s fuchsia-statically-constructed-objects %t // Trivial static is fine static int i; class ClassWithNoCtor {}; class ClassWithCtor { public: ClassWithCtor(int Val) : Val(Val) {} private: int Val; }; class ClassWithConstexpr { public: ClassWithConstexpr(int Val1, int Val2) : Val(Val1) {} constexpr ClassWithConstexpr(int Val) : Val(Val) {} private: int Val; }; ClassWithNoCtor A; ClassWithConstexpr C(0); ClassWithConstexpr E(0, 1); // CHECK-MESSAGES: [[@LINE-1]]:1: warning: static objects are disallowed; if possible, use a constexpr constructor instead [fuchsia-statically-constructed-objects] // CHECK-MESSAGES-NEXT: ClassWithConstexpr E(0, 1); ClassWithCtor G(0); // CHECK-MESSAGES: [[@LINE-1]]:1: warning: static objects are disallowed; if possible, use a constexpr constructor instead [fuchsia-statically-constructed-objects] // CHECK-MESSAGES-NEXT: ClassWithCtor G(0); static ClassWithNoCtor A2; static ClassWithConstexpr C2(0); static ClassWithConstexpr E2(0, 1); // CHECK-MESSAGES: [[@LINE-1]]:1: warning: static objects are disallowed; if possible, use a constexpr constructor instead [fuchsia-statically-constructed-objects] // CHECK-MESSAGES-NEXT: static ClassWithConstexpr E2(0, 1); static ClassWithCtor G2(0); // CHECK-MESSAGES: [[@LINE-1]]:1: warning: static objects are disallowed; if possible, use a constexpr constructor instead [fuchsia-statically-constructed-objects] // CHECK-MESSAGES-NEXT: static ClassWithCtor G2(0); struct StructWithConstexpr { constexpr StructWithConstexpr(int Val) {} }; struct StructWithNoCtor {}; struct StructWithCtor { StructWithCtor(); }; StructWithNoCtor SNoCtor; StructWithConstexpr SConstexpr(0); StructWithCtor SCtor; // CHECK-MESSAGES: [[@LINE-1]]:1: warning: static objects are disallowed; if possible, use a constexpr constructor instead [fuchsia-statically-constructed-objects] // CHECK-MESSAGES-NEXT: StructWithCtor SCtor; static StructWithConstexpr SConstexpr2(0); static StructWithNoCtor SNoCtor2; static StructWithCtor SCtor2; // CHECK-MESSAGES: [[@LINE-1]]:1: warning: static objects are disallowed; if possible, use a constexpr constructor instead [fuchsia-statically-constructed-objects] // CHECK-MESSAGES-NEXT: static StructWithCtor SCtor2; extern StructWithCtor SCtor3; class ClassWithStaticMember { private: static StructWithNoCtor S; }; ClassWithStaticMember Z(); class S { int Val; public: constexpr S(int i) : Val(100 / i) {} int getVal() const { return Val; } }; static S s1(1); static S s2(0); // CHECK-MESSAGES: [[@LINE-1]]:1: warning: static objects are disallowed; if possible, use a constexpr constructor instead [fuchsia-statically-constructed-objects] // CHECK-MESSAGES-NEXT: static S s2(0); extern int get_i(); static S s3(get_i()); // CHECK-MESSAGES: [[@LINE-1]]:1: warning: static objects are disallowed; if possible, use a constexpr constructor instead [fuchsia-statically-constructed-objects] // CHECK-MESSAGES-NEXT: static S s3(get_i()); void f() { // Locally static is fine static int i; static ClassWithNoCtor A2; static ClassWithConstexpr C2(0); static ClassWithConstexpr E2(0, 1); static ClassWithCtor G2(0); }