diff options
author | Julie Hockett <juliehockett@google.com> | 2018-01-11 21:17:43 +0000 |
---|---|---|
committer | Julie Hockett <juliehockett@google.com> | 2018-01-11 21:17:43 +0000 |
commit | 1ee1f49393afac0ff1b0723c3d35129debe571c6 (patch) | |
tree | ea7ebb17c7bc5331da57f02173bf5550c743fe4d /clang-tools-extra/test/clang-tidy/fuchsia-statically-constructed-objects.cpp | |
parent | d423f0d290576fa8e015cca8cb017540473a2761 (diff) | |
download | bcm5719-llvm-1ee1f49393afac0ff1b0723c3d35129debe571c6.tar.gz bcm5719-llvm-1ee1f49393afac0ff1b0723c3d35129debe571c6.zip |
[clang-tidy] Adding Fuchsia checker for statically constructed objects
Adds a check to the Fuchsia module to warn if statically-stored objects
are created, unless constructed with `constexpr`.
See https://fuchsia.googlesource.com/zircon/+/master/docs/cxx.md for
reference.
Differential Revision: https://reviews.llvm.org/D41546
llvm-svn: 322310
Diffstat (limited to 'clang-tools-extra/test/clang-tidy/fuchsia-statically-constructed-objects.cpp')
-rw-r--r-- | clang-tools-extra/test/clang-tidy/fuchsia-statically-constructed-objects.cpp | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/clang-tools-extra/test/clang-tidy/fuchsia-statically-constructed-objects.cpp b/clang-tools-extra/test/clang-tidy/fuchsia-statically-constructed-objects.cpp new file mode 100644 index 00000000000..006494eeca6 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/fuchsia-statically-constructed-objects.cpp @@ -0,0 +1,91 @@ +// 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); +} |