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