1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s 3*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 4*67e74705SXin Li 5*67e74705SXin Li // PR4103 : Make sure we don't get a bogus unused expression warning 6*67e74705SXin Li namespace PR4103 { 7*67e74705SXin Li class APInt { 8*67e74705SXin Li char foo; 9*67e74705SXin Li }; 10*67e74705SXin Li class APSInt : public APInt { 11*67e74705SXin Li char bar; 12*67e74705SXin Li public: 13*67e74705SXin Li APSInt &operator=(const APSInt &RHS); 14*67e74705SXin Li }; 15*67e74705SXin Li operator =(const APSInt & RHS)16*67e74705SXin Li APSInt& APSInt::operator=(const APSInt &RHS) { 17*67e74705SXin Li APInt::operator=(RHS); 18*67e74705SXin Li return *this; 19*67e74705SXin Li } 20*67e74705SXin Li 21*67e74705SXin Li template<typename T> 22*67e74705SXin Li struct X { 23*67e74705SXin Li X(); 24*67e74705SXin Li }; 25*67e74705SXin Li test()26*67e74705SXin Li void test() { 27*67e74705SXin Li X<int>(); 28*67e74705SXin Li } 29*67e74705SXin Li } 30*67e74705SXin Li 31*67e74705SXin Li namespace derefvolatile { f(volatile char * x)32*67e74705SXin Li void f(volatile char* x) { 33*67e74705SXin Li *x; 34*67e74705SXin Li #if __cplusplus <= 199711L 35*67e74705SXin Li // expected-warning@-2 {{expression result unused; assign into a variable to force a volatile load}} 36*67e74705SXin Li #endif 37*67e74705SXin Li (void)*x; 38*67e74705SXin Li #if __cplusplus <= 199711L 39*67e74705SXin Li // expected-warning@-2 {{expression result unused; assign into a variable to force a volatile load}} 40*67e74705SXin Li #endif 41*67e74705SXin Li volatile char y = 10; 42*67e74705SXin Li (void)y; // don't warn here, because it's a common pattern. 43*67e74705SXin Li } 44*67e74705SXin Li } 45*67e74705SXin Li 46*67e74705SXin Li // <rdar://problem/12359208> 47*67e74705SXin Li namespace AnonObject { 48*67e74705SXin Li struct Foo { 49*67e74705SXin Li Foo(const char* const message); 50*67e74705SXin Li ~Foo(); 51*67e74705SXin Li }; f()52*67e74705SXin Li void f() { 53*67e74705SXin Li Foo("Hello World!"); // don't warn 54*67e74705SXin Li int(1); // expected-warning {{expression result unused}} 55*67e74705SXin Li } 56*67e74705SXin Li } 57*67e74705SXin Li 58*67e74705SXin Li // Test that constructing an object (which may have side effects) with 59*67e74705SXin Li // constructor arguments which are dependent doesn't produce an unused value 60*67e74705SXin Li // warning. 61*67e74705SXin Li namespace UnresolvedLookup { 62*67e74705SXin Li struct Foo { 63*67e74705SXin Li Foo(int i, int j); 64*67e74705SXin Li }; 65*67e74705SXin Li template <typename T> 66*67e74705SXin Li struct Bar { fUnresolvedLookup::Bar67*67e74705SXin Li void f(T t) { 68*67e74705SXin Li Foo(t, 0); // no warning 69*67e74705SXin Li } 70*67e74705SXin Li }; 71*67e74705SXin Li } 72