diff options
Diffstat (limited to 'test/SemaCXX/warn-self-assign-builtin.cpp')
-rw-r--r-- | test/SemaCXX/warn-self-assign-builtin.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/test/SemaCXX/warn-self-assign-builtin.cpp b/test/SemaCXX/warn-self-assign-builtin.cpp new file mode 100644 index 0000000000000..212fc241e3e7e --- /dev/null +++ b/test/SemaCXX/warn-self-assign-builtin.cpp @@ -0,0 +1,67 @@ +// RUN: %clang_cc1 -fsyntax-only -Wself-assign -verify %s + +void f() { + int a = 42, b = 42; + a = a; // expected-warning{{explicitly assigning}} + b = b; // expected-warning{{explicitly assigning}} + a = b; + b = a = b; + a = a = a; // expected-warning{{explicitly assigning}} + a = b = b = a; + + a *= a; + a /= a; + a %= a; + a += a; + a -= a; + a <<= a; + a >>= a; + a &= a; // expected-warning {{explicitly assigning}} + a |= a; // expected-warning {{explicitly assigning}} + a ^= a; +} + +// Dummy type. +struct S {}; + +void false_positives() { +#define OP = +#define LHS a +#define RHS a + int a = 42; + // These shouldn't warn due to the use of the preprocessor. + a OP a; + LHS = a; + a = RHS; + LHS OP RHS; +#undef OP +#undef LHS +#undef RHS + + // A way to silence the warning. + a = (int &)a; + + // Volatile stores aren't side-effect free. + volatile int vol_a; + vol_a = vol_a; + volatile int &vol_a_ref = vol_a; + vol_a_ref = vol_a_ref; +} + +// Do not diagnose self-assigment in an unevaluated context +void false_positives_unevaluated_ctx(int a) noexcept(noexcept(a = a)) // expected-warning {{expression with side effects has no effect in an unevaluated context}} +{ + decltype(a = a) b = a; // expected-warning {{expression with side effects has no effect in an unevaluated context}} + static_assert(noexcept(a = a), ""); // expected-warning {{expression with side effects has no effect in an unevaluated context}} + static_assert(sizeof(a = a), ""); // expected-warning {{expression with side effects has no effect in an unevaluated context}} +} + +template <typename T> +void g() { + T a; + a = a; // expected-warning{{explicitly assigning}} +} +void instantiate() { + g<int>(); + g<S>(); +} |