10faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall// RUN: %clang_cc1 -fsyntax-only -verify -Wunused-value %s 20faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall 30faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall// PR4806 40faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCallnamespace test0 { 50faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall class Box { 60faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall public: 70faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall int i; 80faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall volatile int j; 90faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall }; 100faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall 110faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall void doit() { 120faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall // pointer to volatile has side effect (thus no warning) 130faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall Box* box = new Box; 140faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall box->i; // expected-warning {{expression result unused}} 15a6115068cde719142eb394db88612c185cabd05bEli Friedman box->j; // expected-warning {{expression result unused}} 160faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall } 170faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall} 186e5218367c513fe02d1c7210023d40739ecb1572Matt Beaumont-Gay 196e5218367c513fe02d1c7210023d40739ecb1572Matt Beaumont-Gaynamespace test1 { 206e5218367c513fe02d1c7210023d40739ecb1572Matt Beaumont-Gaystruct Foo { 216e5218367c513fe02d1c7210023d40739ecb1572Matt Beaumont-Gay int i; 226e5218367c513fe02d1c7210023d40739ecb1572Matt Beaumont-Gay bool operator==(const Foo& rhs) { 236e5218367c513fe02d1c7210023d40739ecb1572Matt Beaumont-Gay return i == rhs.i; 246e5218367c513fe02d1c7210023d40739ecb1572Matt Beaumont-Gay } 256e5218367c513fe02d1c7210023d40739ecb1572Matt Beaumont-Gay}; 266e5218367c513fe02d1c7210023d40739ecb1572Matt Beaumont-Gay 276e5218367c513fe02d1c7210023d40739ecb1572Matt Beaumont-Gay#define NOP(x) (x) 286e5218367c513fe02d1c7210023d40739ecb1572Matt Beaumont-Gayvoid b(Foo f1, Foo f2) { 296e5218367c513fe02d1c7210023d40739ecb1572Matt Beaumont-Gay NOP(f1 == f2); // expected-warning {{expression result unused}} 306e5218367c513fe02d1c7210023d40739ecb1572Matt Beaumont-Gay} 316e5218367c513fe02d1c7210023d40739ecb1572Matt Beaumont-Gay#undef NOP 326e5218367c513fe02d1c7210023d40739ecb1572Matt Beaumont-Gay} 335a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewycky 345a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewyckynamespace test2 { 35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern "C++" { 365a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewycky namespace std { 375a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewycky template<typename T> struct basic_string { 385a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewycky struct X {}; 395a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewycky void method() const { 405a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewycky X* x; 415a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewycky &x[0]; // expected-warning {{expression result unused}} 425a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewycky } 435a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewycky }; 445a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewycky typedef basic_string<char> string; 455a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewycky void func(const std::string& str) { 465a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewycky str.method(); // expected-note {{in instantiation of member function}} 475a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewycky } 485a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewycky } 495a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewycky } 505a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewycky} 515a7120cf82b5f0110cb70aacad850c594a55b378Nick Lewycky 5281e4549fede62835235a53c024909c3fab6b73acLubos Lunaknamespace test3 { 5381e4549fede62835235a53c024909c3fab6b73acLubos Lunakstruct Used { 5481e4549fede62835235a53c024909c3fab6b73acLubos Lunak Used(); 5581e4549fede62835235a53c024909c3fab6b73acLubos Lunak Used(int); 5681e4549fede62835235a53c024909c3fab6b73acLubos Lunak Used(int, int); 5781e4549fede62835235a53c024909c3fab6b73acLubos Lunak}; 5881e4549fede62835235a53c024909c3fab6b73acLubos Lunakstruct __attribute__((warn_unused)) Unused { 5981e4549fede62835235a53c024909c3fab6b73acLubos Lunak Unused(); 6081e4549fede62835235a53c024909c3fab6b73acLubos Lunak Unused(int); 6181e4549fede62835235a53c024909c3fab6b73acLubos Lunak Unused(int, int); 6281e4549fede62835235a53c024909c3fab6b73acLubos Lunak}; 6381e4549fede62835235a53c024909c3fab6b73acLubos Lunakvoid f() { 6481e4549fede62835235a53c024909c3fab6b73acLubos Lunak Used(); 6581e4549fede62835235a53c024909c3fab6b73acLubos Lunak Used(1); 6681e4549fede62835235a53c024909c3fab6b73acLubos Lunak Used(1, 1); 6781e4549fede62835235a53c024909c3fab6b73acLubos Lunak Unused(); // expected-warning {{expression result unused}} 6881e4549fede62835235a53c024909c3fab6b73acLubos Lunak Unused(1); // expected-warning {{expression result unused}} 6981e4549fede62835235a53c024909c3fab6b73acLubos Lunak Unused(1, 1); // expected-warning {{expression result unused}} 7081e4549fede62835235a53c024909c3fab6b73acLubos Lunak} 7181e4549fede62835235a53c024909c3fab6b73acLubos Lunak} 72