124 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify -Wunused %s2// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 -Wunused %s3// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -Wunused %s4// RUN: %clang_cc1 -fsyntax-only -verify -std=c++17 -Wunused %s5 6// PR4103 : Make sure we don't get a bogus unused expression warning7namespace PR4103 {8 class APInt {9 char foo; // expected-warning {{private field 'foo' is not used}}10 };11 class APSInt : public APInt {12 char bar; // expected-warning {{private field 'bar' is not used}}13 public:14 APSInt &operator=(const APSInt &RHS);15 };16 17 APSInt& APSInt::operator=(const APSInt &RHS) {18 APInt::operator=(RHS);19 return *this;20 }21 22 template<typename T>23 struct X {24 X();25 };26 27 void test() {28 X<int>();29 }30}31 32namespace derefvolatile {33 void f(volatile char* x) {34 *x;35#if __cplusplus <= 199711L36 // expected-warning@-2 {{expression result unused; assign into a variable to force a volatile load}}37#endif38 (void)*x;39#if __cplusplus <= 199711L40 // expected-warning@-2 {{expression result unused; assign into a variable to force a volatile load}}41#endif42 volatile char y = 10;43 (void)y; // don't warn here, because it's a common pattern.44 }45}46 47namespace AnonObject {48 struct Foo {49 Foo(const char* const message);50 ~Foo();51 };52 void f() {53 Foo("Hello World!"); // don't warn54 int(1); // expected-warning {{expression result unused}}55 }56}57 58// Test that constructing an object (which may have side effects) with59// constructor arguments which are dependent doesn't produce an unused value60// warning.61namespace UnresolvedLookup {62 struct Foo {63 Foo(int i, int j);64 };65 template <typename T>66 struct Bar {67 void f(T t) {68 Foo(t, 0); // no warning69 }70 };71}72 73#if __cplusplus >= 201703L74namespace PR33839 {75 void a() {76 struct X { int a, b; } x;77 auto [a, b] = x; // expected-warning {{unused variable '[a, b]'}}78 auto [c, d] = x;79 (void)d;80 }81 82 template<typename T> void f() {83 struct A { int n; } a[1];84 for (auto [x] : a) {85 (void)x;86 }87 auto [y] = a[0]; // expected-warning {{unused}}88 }89 template<bool b> void g() {90 struct A { int n; } a[1];91 for (auto [x] : a) {92 if constexpr (b)93 (void)x;94 }95 96 auto [y] = a[0];97 if constexpr (b)98 (void)y; // ok, even when b == false99 }100 template<typename T> void h() {101 struct A { int n; } a[1];102 for (auto [x] : a) { // expected-warning {{unused variable '[x]'}}103 }104 }105 void use() {106 f<int>(); // expected-note {{instantiation of}}107 g<true>();108 g<false>();109 h<int>(); // expected-note {{instantiation of}}110 }111}112 113namespace maybe_unused_binding {114 115void test() {116 struct X { int a, b; } x;117 auto [a [[maybe_unused]], b] = x; // expected-warning {{an attribute specifier sequence attached to a structured binding declaration is a C++2c extension}} \118 // expected-warning {{unused variable '[a, b]'}}119}120 121}122 123#endif124