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