xref: /minix3/external/bsd/llvm/dist/clang/test/SemaCXX/warn-self-assign.cpp (revision 5ba302fdeaa9e153d58b5dcaef42d660aedee92e)
1 // RUN: %clang_cc1 -fsyntax-only -Wself-assign -verify %s
2 
3 void 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;
11 }
12 
13 // Dummy type.
14 struct S {};
15 
16 void false_positives() {
17 #define OP =
18 #define LHS a
19 #define RHS a
20   int a = 42;
21   // These shouldn't warn due to the use of the preprocessor.
22   a OP a;
23   LHS = a;
24   a = RHS;
25   LHS OP RHS;
26 #undef OP
27 #undef LHS
28 #undef RHS
29 
30   S s;
31   s = s; // Not a builtin assignment operator, no warning.
32 
33   // Volatile stores aren't side-effect free.
34   volatile int vol_a;
35   vol_a = vol_a;
36   volatile int &vol_a_ref = vol_a;
37   vol_a_ref = vol_a_ref;
38 }
39 
40 template <typename T> void g() {
41   T a;
42   a = a; // May or may not be a builtin assignment operator, no warning.
43 }
44 void instantiate() {
45   g<int>();
46   g<S>();
47 }
48