1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
2a6115068cde719142eb394db88612c185cabd05bEli Friedman
3852871abbff45f1c1d3787755a27fce08365b166Eli Friedman// PR4103 : Make sure we don't get a bogus unused expression warning
4a6115068cde719142eb394db88612c185cabd05bEli Friedmannamespace PR4103 {
5a6115068cde719142eb394db88612c185cabd05bEli Friedman  class APInt {
6a6115068cde719142eb394db88612c185cabd05bEli Friedman    char foo;
7a6115068cde719142eb394db88612c185cabd05bEli Friedman  };
8a6115068cde719142eb394db88612c185cabd05bEli Friedman  class APSInt : public APInt {
9a6115068cde719142eb394db88612c185cabd05bEli Friedman    char bar;
10a6115068cde719142eb394db88612c185cabd05bEli Friedman  public:
11a6115068cde719142eb394db88612c185cabd05bEli Friedman    APSInt &operator=(const APSInt &RHS);
12a6115068cde719142eb394db88612c185cabd05bEli Friedman  };
13852871abbff45f1c1d3787755a27fce08365b166Eli Friedman
14a6115068cde719142eb394db88612c185cabd05bEli Friedman  APSInt& APSInt::operator=(const APSInt &RHS) {
15a6115068cde719142eb394db88612c185cabd05bEli Friedman    APInt::operator=(RHS);
16a6115068cde719142eb394db88612c185cabd05bEli Friedman    return *this;
17a6115068cde719142eb394db88612c185cabd05bEli Friedman  }
186a0166edea84e6abccce393c15e3dee7b96f7eb6Douglas Gregor
19a6115068cde719142eb394db88612c185cabd05bEli Friedman  template<typename T>
20a6115068cde719142eb394db88612c185cabd05bEli Friedman  struct X {
21a6115068cde719142eb394db88612c185cabd05bEli Friedman    X();
22a6115068cde719142eb394db88612c185cabd05bEli Friedman  };
23a6115068cde719142eb394db88612c185cabd05bEli Friedman
24a6115068cde719142eb394db88612c185cabd05bEli Friedman  void test() {
25a6115068cde719142eb394db88612c185cabd05bEli Friedman    X<int>();
26a6115068cde719142eb394db88612c185cabd05bEli Friedman  }
27a6115068cde719142eb394db88612c185cabd05bEli Friedman}
286a0166edea84e6abccce393c15e3dee7b96f7eb6Douglas Gregor
29a6115068cde719142eb394db88612c185cabd05bEli Friedmannamespace derefvolatile {
30a6115068cde719142eb394db88612c185cabd05bEli Friedman  void f(volatile char* x) {
31a6115068cde719142eb394db88612c185cabd05bEli Friedman    *x; // expected-warning {{expression result unused; assign into a variable to force a volatile load}}
32a6115068cde719142eb394db88612c185cabd05bEli Friedman    (void)*x; // expected-warning {{expression result unused; assign into a variable to force a volatile load}}
334059da87fa2fe9f415c9656dc63e75d5d4a489efEli Friedman    volatile char y = 10;
344059da87fa2fe9f415c9656dc63e75d5d4a489efEli Friedman    (void)y; // don't warn here, because it's a common pattern.
35a6115068cde719142eb394db88612c185cabd05bEli Friedman  }
366a0166edea84e6abccce393c15e3dee7b96f7eb6Douglas Gregor}
376319917b5021e9602389b49ca4f245d235e9b90aEli Friedman
386319917b5021e9602389b49ca4f245d235e9b90aEli Friedman// <rdar://problem/12359208>
396319917b5021e9602389b49ca4f245d235e9b90aEli Friedmannamespace AnonObject {
406319917b5021e9602389b49ca4f245d235e9b90aEli Friedman  struct Foo {
416319917b5021e9602389b49ca4f245d235e9b90aEli Friedman    Foo(const char* const message);
426319917b5021e9602389b49ca4f245d235e9b90aEli Friedman    ~Foo();
436319917b5021e9602389b49ca4f245d235e9b90aEli Friedman  };
446319917b5021e9602389b49ca4f245d235e9b90aEli Friedman  void f() {
456319917b5021e9602389b49ca4f245d235e9b90aEli Friedman    Foo("Hello World!");  // don't warn
466319917b5021e9602389b49ca4f245d235e9b90aEli Friedman    int(1); // expected-warning {{expression result unused}}
476319917b5021e9602389b49ca4f245d235e9b90aEli Friedman  }
486319917b5021e9602389b49ca4f245d235e9b90aEli Friedman}
4984c3b9745f813a784b5d8ce77f2785750523d9ebMatt Beaumont-Gay
5084c3b9745f813a784b5d8ce77f2785750523d9ebMatt Beaumont-Gay// Test that constructing an object (which may have side effects) with
5184c3b9745f813a784b5d8ce77f2785750523d9ebMatt Beaumont-Gay// constructor arguments which are dependent doesn't produce an unused value
5284c3b9745f813a784b5d8ce77f2785750523d9ebMatt Beaumont-Gay// warning.
5384c3b9745f813a784b5d8ce77f2785750523d9ebMatt Beaumont-Gaynamespace UnresolvedLookup {
5484c3b9745f813a784b5d8ce77f2785750523d9ebMatt Beaumont-Gay  struct Foo {
5584c3b9745f813a784b5d8ce77f2785750523d9ebMatt Beaumont-Gay    Foo(int i, int j);
5684c3b9745f813a784b5d8ce77f2785750523d9ebMatt Beaumont-Gay  };
5784c3b9745f813a784b5d8ce77f2785750523d9ebMatt Beaumont-Gay  template <typename T>
5884c3b9745f813a784b5d8ce77f2785750523d9ebMatt Beaumont-Gay  struct Bar {
5984c3b9745f813a784b5d8ce77f2785750523d9ebMatt Beaumont-Gay    void f(T t) {
6084c3b9745f813a784b5d8ce77f2785750523d9ebMatt Beaumont-Gay      Foo(t, 0);  // no warning
6184c3b9745f813a784b5d8ce77f2785750523d9ebMatt Beaumont-Gay    }
6284c3b9745f813a784b5d8ce77f2785750523d9ebMatt Beaumont-Gay  };
6384c3b9745f813a784b5d8ce77f2785750523d9ebMatt Beaumont-Gay}
64