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