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