xref: /aosp_15_r20/external/clang/test/SemaCXX/unused.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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