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 Benfieldint 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 Benfieldvoid 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 Benfieldvoid 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 Bergmannvoid 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 Bergmanntemplate<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