blob: 7d558c6a073e834af152af956799aebc0c6f3e23 [file] [log] [blame]
Chandler Carruthe0cee6a2011-01-04 06:52:15 +00001// RUN: %clang_cc1 -fsyntax-only -Wself-assign -verify %s
2
3void f() {
4 int a = 42, b = 42;
5 a = a; // expected-warning{{explicitly assigning}}
6 b = b; // expected-warning{{explicitly assigning}}
7 a = b;
8 b = a = b;
9 a = a = a; // expected-warning{{explicitly assigning}}
10 a = b = b = a;
Nikola Smiljanic292b5ce2014-05-30 00:15:04 +000011 a &= a; // expected-warning{{explicitly assigning}}
12 a |= a; // expected-warning{{explicitly assigning}}
13 a ^= a;
Chandler Carruthe0cee6a2011-01-04 06:52:15 +000014}
15
16// Dummy type.
17struct S {};
18
19void false_positives() {
20#define OP =
21#define LHS a
22#define RHS a
23 int a = 42;
24 // These shouldn't warn due to the use of the preprocessor.
25 a OP a;
26 LHS = a;
27 a = RHS;
28 LHS OP RHS;
29#undef OP
30#undef LHS
31#undef RHS
32
33 S s;
34 s = s; // Not a builtin assignment operator, no warning.
35
36 // Volatile stores aren't side-effect free.
37 volatile int vol_a;
38 vol_a = vol_a;
39 volatile int &vol_a_ref = vol_a;
40 vol_a_ref = vol_a_ref;
41}
42
43template <typename T> void g() {
44 T a;
45 a = a; // May or may not be a builtin assignment operator, no warning.
46}
47void instantiate() {
48 g<int>();
49 g<S>();
50}