1cf49cae2SMichael Benfield // RUN: %clang_cc1 -fblocks -fsyntax-only -Wunused-but-set-variable -verify %s
2cf49cae2SMichael Benfield 
3cf49cae2SMichael Benfield struct S {
4cf49cae2SMichael Benfield   int i;
5cf49cae2SMichael Benfield };
6cf49cae2SMichael Benfield 
7cf49cae2SMichael Benfield struct __attribute__((warn_unused)) SWarnUnused {
8cf49cae2SMichael Benfield   int j;
9b5b9489bSStephan Bergmann   void operator +=(int);
10*2af845a6SDávid Bolvanský   void operator ++();
11cf49cae2SMichael Benfield };
12cf49cae2SMichael Benfield 
f0()13cf49cae2SMichael Benfield int f0() {
14cf49cae2SMichael Benfield   int y; // expected-warning{{variable 'y' set but not used}}
15cf49cae2SMichael Benfield   y = 0;
16cf49cae2SMichael Benfield 
17cf49cae2SMichael Benfield   int z __attribute__((unused));
18cf49cae2SMichael Benfield   z = 0;
19cf49cae2SMichael Benfield 
20cf49cae2SMichael Benfield   // In C++, don't warn for structs. (following gcc's behavior)
21cf49cae2SMichael Benfield   struct S s;
22cf49cae2SMichael Benfield   struct S t;
23cf49cae2SMichael Benfield   s = t;
24cf49cae2SMichael Benfield 
25cf49cae2SMichael Benfield   // Unless it's marked with the warn_unused attribute.
26cf49cae2SMichael Benfield   struct SWarnUnused swu; // expected-warning{{variable 'swu' set but not used}}
27cf49cae2SMichael Benfield   struct SWarnUnused swu2;
28cf49cae2SMichael Benfield   swu = swu2;
29cf49cae2SMichael Benfield 
30cf49cae2SMichael Benfield   int x;
31cf49cae2SMichael Benfield   x = 0;
32cf49cae2SMichael Benfield   return x + 5;
33cf49cae2SMichael Benfield }
34cf49cae2SMichael Benfield 
f1(void)35cf49cae2SMichael Benfield void f1(void) {
36cf49cae2SMichael Benfield   (void)^() {
37cf49cae2SMichael Benfield     int y; // expected-warning{{variable 'y' set but not used}}
38cf49cae2SMichael Benfield     y = 0;
39cf49cae2SMichael Benfield 
40cf49cae2SMichael Benfield     int x;
41cf49cae2SMichael Benfield     x = 0;
42cf49cae2SMichael Benfield     return x;
43cf49cae2SMichael Benfield   };
44cf49cae2SMichael Benfield }
45cf49cae2SMichael Benfield 
f2()46cf49cae2SMichael Benfield void f2() {
47cf49cae2SMichael Benfield   // Don't warn for either of these cases.
48cf49cae2SMichael Benfield   constexpr int x = 2;
49cf49cae2SMichael Benfield   const int y = 1;
50cf49cae2SMichael Benfield   char a[x];
51cf49cae2SMichael Benfield   char b[y];
52cf49cae2SMichael Benfield }
53b5b9489bSStephan Bergmann 
f3(int n)54b5b9489bSStephan Bergmann void f3(int n) {
55b5b9489bSStephan Bergmann   // Don't warn for overloaded compound assignment operators.
56b5b9489bSStephan Bergmann   SWarnUnused swu;
57b5b9489bSStephan Bergmann   swu += n;
58b5b9489bSStephan Bergmann }
59b5b9489bSStephan Bergmann 
f4(T n)60b5b9489bSStephan Bergmann template<typename T> void f4(T n) {
61b5b9489bSStephan Bergmann   // Don't warn for (potentially) overloaded compound assignment operators in
62b5b9489bSStephan Bergmann   // template code.
63b5b9489bSStephan Bergmann   SWarnUnused swu;
64b5b9489bSStephan Bergmann   swu += n;
65b5b9489bSStephan Bergmann }
66*2af845a6SDávid Bolvanský 
f5()67*2af845a6SDávid Bolvanský template <typename T> void f5() {
68*2af845a6SDávid Bolvanský   // Don't warn for overloaded pre/post operators in template code.
69*2af845a6SDávid Bolvanský   SWarnUnused swu;
70*2af845a6SDávid Bolvanský   ++swu;
71*2af845a6SDávid Bolvanský }
72