[libcxx-commits] [libcxx] [libc++] Diagnose unused variables of container types (PR #203084)

via libcxx-commits libcxx-commits at lists.llvm.org
Fri Jun 12 04:30:12 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libcxx

Author: Nikolas Klauser (philnik777)

<details>
<summary>Changes</summary>



---

Patch is 108.73 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/203084.diff


109 Files Affected:

- (modified) libcxx/include/__bit_reference (+1-1) 
- (modified) libcxx/include/__hash_table (+1-1) 
- (modified) libcxx/include/__iterator/wrap_iter.h (+1-1) 
- (modified) libcxx/include/__tree (+1-1) 
- (modified) libcxx/include/__vector/vector.h (+1-1) 
- (modified) libcxx/include/__vector/vector_bool.h (+1-1) 
- (modified) libcxx/include/deque (+2-2) 
- (modified) libcxx/include/forward_list (+3-3) 
- (modified) libcxx/include/list (+3-3) 
- (modified) libcxx/include/map (+4-4) 
- (modified) libcxx/include/set (+2-2) 
- (modified) libcxx/include/string (+1-1) 
- (modified) libcxx/include/unordered_map (+4-4) 
- (modified) libcxx/include/unordered_set (+2-2) 
- (modified) libcxx/test/benchmarks/containers/sequence/sequence_container_benchmarks.h (-1) 
- (modified) libcxx/test/libcxx/containers/associative/non_const_comparator.incomplete.verify.cpp (+2) 
- (modified) libcxx/test/libcxx/containers/associative/non_const_comparator.verify.cpp (+4) 
- (modified) libcxx/test/libcxx/containers/sequences/vector/robust_against_adl.pass.cpp (+1) 
- (modified) libcxx/test/libcxx/containers/unord/non_const_comparator.incomplete.verify.cpp (+2) 
- (modified) libcxx/test/libcxx/containers/unord/non_const_comparator.verify.cpp (+4) 
- (modified) libcxx/test/libcxx/containers/unord/unord.set/missing_hash_specialization.verify.cpp (+4) 
- (added) libcxx/test/libcxx/diagnostics/unused_variables.verify.cpp (+68) 
- (modified) libcxx/test/libcxx/input.output/filesystems/nodiscard.verify.cpp (-1) 
- (modified) libcxx/test/libcxx/iterators/nodiscard.verify.cpp (+1-1) 
- (modified) libcxx/test/libcxx/strings/basic.string/nonnull.verify.cpp (+3-3) 
- (modified) libcxx/test/libcxx/strings/basic.string/string.cons/constinit_sso_string.compile.pass.cpp (+1-1) 
- (modified) libcxx/test/std/containers/associative/from_range_associative_containers.h (+2) 
- (modified) libcxx/test/std/containers/associative/map/incomplete_type.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/associative/map/map.cons/copy_assign.addressof.compile.pass.cpp (+2) 
- (modified) libcxx/test/std/containers/associative/multimap/incomplete_type.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/associative/multimap/multimap.cons/copy_assign.addressof.compile.pass.cpp (+2) 
- (modified) libcxx/test/std/containers/associative/multiset/multiset.cons/copy_assign.addressof.compile.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/associative/set/set.cons/copy_assign.addressof.compile.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/sequences/deque/deque.cons/move_assign.addressof.compile.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/sequences/forwardlist/exception_safety.pass.cpp (+2) 
- (modified) libcxx/test/std/containers/sequences/forwardlist/forwardlist.cons/assign_copy.addressof.compile.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/sequences/from_range_sequence_containers.h (+1) 
- (modified) libcxx/test/std/containers/sequences/list/exception_safety.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/sequences/list/list.cons/assign_copy.addressof.compile.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/sequences/list/list.cons/assign_move.addressof.compile.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/sequences/list/list.cons/input_iterator.pass.cpp (+8) 
- (modified) libcxx/test/std/containers/sequences/vector.bool/ctor_exceptions.pass.cpp (+13) 
- (modified) libcxx/test/std/containers/sequences/vector/addressof.compile.pass.cpp (+2) 
- (modified) libcxx/test/std/containers/sequences/vector/vector.cons/construct_iter_iter.pass.cpp (+9) 
- (modified) libcxx/test/std/containers/sequences/vector/vector.cons/construct_iter_iter_alloc.pass.cpp (+9) 
- (modified) libcxx/test/std/containers/sequences/vector/vector.cons/copy.move_only.verify.cpp (+1) 
- (modified) libcxx/test/std/containers/sequences/vector/vector.cons/exceptions.pass.cpp (+18) 
- (modified) libcxx/test/std/containers/unord/from_range_unordered_containers.h (+4) 
- (modified) libcxx/test/std/containers/unord/unord.map/incomplete_type.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/unord/unord.map/iterators.pass.cpp (+4) 
- (modified) libcxx/test/std/containers/unord/unord.map/unord.map.cnstr/assign_copy.addressof.compile.pass.cpp (+2) 
- (modified) libcxx/test/std/containers/unord/unord.map/unord.map.cnstr/assign_move.addressof.compile.pass.cpp (+2) 
- (modified) libcxx/test/std/containers/unord/unord.map/unord.map.cnstr/move.addressof.compile.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/unord/unord.map/unord.map.cnstr/move_alloc.addressof.compile.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/unord/unord.multimap/incomplete.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/unord/unord.multimap/iterators.pass.cpp (+2) 
- (modified) libcxx/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/assign_copy.addressof.compile.pass.cpp (+2) 
- (modified) libcxx/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/move.addressof.compile.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/move_alloc.addressof.compile.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/unord/unord.multiset/iterators.pass.cpp (+4) 
- (modified) libcxx/test/std/containers/unord/unord.multiset/unord.multiset.cnstr/assign_copy.addressof.compile.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/unord/unord.multiset/unord.multiset.cnstr/move.addressof.compile.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/unord/unord.multiset/unord.multiset.cnstr/move_alloc.addressof.compile.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/unord/unord.set/iterators.pass.cpp (+4) 
- (modified) libcxx/test/std/containers/unord/unord.set/unord.set.cnstr/assign_copy.addressof.compile.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/unord/unord.set/unord.set.cnstr/move.addressof.compile.pass.cpp (+1) 
- (modified) libcxx/test/std/containers/unord/unord.set/unord.set.cnstr/move_alloc.addressof.compile.pass.cpp (+1) 
- (modified) libcxx/test/std/localization/locale.categories/category.ctype/facet.ctype.special/facet.ctype.char.members/scan_is.pass.cpp (-2) 
- (modified) libcxx/test/std/localization/locale.categories/category.ctype/facet.ctype.special/facet.ctype.char.members/scan_not.pass.cpp (-2) 
- (modified) libcxx/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/scan_is.pass.cpp (-3) 
- (modified) libcxx/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/scan_not.pass.cpp (-3) 
- (modified) libcxx/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/scan_is.pass.cpp (-1) 
- (modified) libcxx/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/scan_not.pass.cpp (-2) 
- (modified) libcxx/test/std/localization/locale.categories/category.time/locale.time.put/locale.time.put.members/put2.pass.cpp (+3) 
- (modified) libcxx/test/std/localization/locales/locale.convenience/conversions/conversions.string/converted.pass.cpp (+6-6) 
- (modified) libcxx/test/std/ranges/range.adaptors/range.lazy.split/general.pass.cpp (-3) 
- (modified) libcxx/test/std/ranges/range.adaptors/range.split/general.pass.cpp (-3) 
- (modified) libcxx/test/std/ranges/range.utility/range.utility.conv/to_std_containers.pass.cpp (+1-1) 
- (modified) libcxx/test/std/re/re.regex/re.regex.construct/il_flg.pass.cpp (-5) 
- (modified) libcxx/test/std/strings/basic.string/string.cons/T_size_size.pass.cpp (+2) 
- (modified) libcxx/test/std/strings/basic.string/string.cons/dtor.pass.cpp (+1) 
- (modified) libcxx/test/std/strings/basic.string/string.cons/from_range.pass.cpp (+1-1) 
- (modified) libcxx/test/std/strings/basic.string/string.cons/move_alloc.pass.cpp (+1) 
- (modified) libcxx/test/std/strings/basic.string/string.cons/substr.pass.cpp (+3) 
- (modified) libcxx/test/std/strings/basic.string/string.modifiers/string_erase/size_size.pass.cpp (+2-2) 
- (modified) libcxx/test/std/strings/basic.string/string.modifiers/string_insert/size_T_size_size.pass.cpp (+2-2) 
- (modified) libcxx/test/std/strings/basic.string/string.modifiers/string_insert/size_pointer.pass.cpp (+1-1) 
- (modified) libcxx/test/std/strings/basic.string/string.modifiers/string_insert/size_pointer_size.pass.cpp (+1-1) 
- (modified) libcxx/test/std/strings/basic.string/string.modifiers/string_insert/size_size_char.pass.cpp (+1-1) 
- (modified) libcxx/test/std/strings/basic.string/string.modifiers/string_insert/size_string.pass.cpp (+1-1) 
- (modified) libcxx/test/std/strings/basic.string/string.modifiers/string_insert/size_string_size_size.pass.cpp (+2-2) 
- (modified) libcxx/test/std/strings/basic.string/string.modifiers/string_insert/string_view.pass.cpp (+1-1) 
- (modified) libcxx/test/std/strings/basic.string/string.modifiers/string_replace/size_size_T_size_size.pass.cpp (+2-2) 
- (modified) libcxx/test/std/strings/basic.string/string.modifiers/string_replace/size_size_pointer.pass.cpp (+1-1) 
- (modified) libcxx/test/std/strings/basic.string/string.modifiers/string_replace/size_size_pointer_size.pass.cpp (+1-1) 
- (modified) libcxx/test/std/strings/basic.string/string.modifiers/string_replace/size_size_size_char.pass.cpp (+1-1) 
- (modified) libcxx/test/std/strings/basic.string/string.modifiers/string_replace/size_size_string.pass.cpp (+1-1) 
- (modified) libcxx/test/std/strings/basic.string/string.modifiers/string_replace/size_size_string_size_size.pass.cpp (+2-2) 
- (modified) libcxx/test/std/strings/basic.string/string.modifiers/string_replace/size_size_string_view.pass.cpp (+1-1) 
- (modified) libcxx/test/std/strings/basic.string/string.ops/string_substr/substr.pass.cpp (+1) 
- (modified) libcxx/test/std/strings/basic.string/string.ops/string_substr/substr_rvalue.pass.cpp (+1) 
- (modified) libcxx/test/std/utilities/utility/mem.res/mem.res.aliases/header_deque_synop2.pass.cpp (+1-1) 
- (modified) libcxx/test/std/utilities/utility/mem.res/mem.res.aliases/header_list_synop2.pass.cpp (+1-1) 
- (modified) libcxx/test/std/utilities/utility/mem.res/mem.res.aliases/header_map_synop2.pass.cpp (+2-2) 
- (modified) libcxx/test/std/utilities/utility/mem.res/mem.res.aliases/header_set_synop2.pass.cpp (+2-2) 
- (modified) libcxx/test/std/utilities/utility/mem.res/mem.res.aliases/header_string_synop2.pass.cpp (+4-4) 
- (modified) libcxx/test/std/utilities/utility/mem.res/mem.res.aliases/header_unordered_map_synop2.pass.cpp (+2-2) 
- (modified) libcxx/test/std/utilities/utility/mem.res/mem.res.aliases/header_unordered_set_synop2.pass.cpp (+2-2) 
- (modified) libcxx/test/std/utilities/utility/mem.res/mem.res.aliases/header_vector_synop2.pass.cpp (+1-1) 


``````````diff
diff --git a/libcxx/include/__bit_reference b/libcxx/include/__bit_reference
index 692686f1584d0..276d8ccf72141 100644
--- a/libcxx/include/__bit_reference
+++ b/libcxx/include/__bit_reference
@@ -274,7 +274,7 @@ struct __bit_array {
 };
 
 template <class _Cp, bool _IsConst, typename _Cp::__storage_type>
-class __bit_iterator {
+class [[__gnu__::__warn_unused__]] __bit_iterator {
 public:
   using difference_type = typename __size_difference_type_traits<_Cp>::difference_type;
   using value_type      = bool;
diff --git a/libcxx/include/__hash_table b/libcxx/include/__hash_table
index 0ce4cf3edd6fd..3701288f10db7 100644
--- a/libcxx/include/__hash_table
+++ b/libcxx/include/__hash_table
@@ -289,7 +289,7 @@ private:
 };
 
 template <class _NodePtr>
-class __hash_const_iterator {
+class [[__gnu__::__warn_unused__]] __hash_const_iterator {
   static_assert(!is_const<typename pointer_traits<_NodePtr>::element_type>::value, "");
   typedef __hash_node_types<_NodePtr> _NodeTypes;
   typedef _NodePtr __node_pointer;
diff --git a/libcxx/include/__iterator/wrap_iter.h b/libcxx/include/__iterator/wrap_iter.h
index d4eccbed473f9..0c4829a08ea36 100644
--- a/libcxx/include/__iterator/wrap_iter.h
+++ b/libcxx/include/__iterator/wrap_iter.h
@@ -31,7 +31,7 @@
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 template <class _Iter>
-class __wrap_iter {
+class [[__gnu__::__warn_unused__]] __wrap_iter {
 public:
   typedef typename iterator_traits<_Iter>::value_type value_type;
   typedef typename iterator_traits<_Iter>::difference_type difference_type;
diff --git a/libcxx/include/__tree b/libcxx/include/__tree
index 94c88e273870a..d9321b3db79f2 100644
--- a/libcxx/include/__tree
+++ b/libcxx/include/__tree
@@ -802,7 +802,7 @@ struct __specialized_algorithm<
 #endif
 
 template <class _Tp, class _NodePtr, class _DiffType>
-class __tree_const_iterator {
+class [[__gnu__::__warn_unused__]] __tree_const_iterator {
   using _NodeTypes _LIBCPP_NODEBUG = __tree_node_types<_NodePtr>;
   // NOLINTNEXTLINE(libcpp-nodebug-on-aliases) lldb relies on this alias for pretty printing
   using __node_pointer                      = _NodePtr;
diff --git a/libcxx/include/__vector/vector.h b/libcxx/include/__vector/vector.h
index 2a081e3cdb1e2..ff998f9dd883b 100644
--- a/libcxx/include/__vector/vector.h
+++ b/libcxx/include/__vector/vector.h
@@ -84,7 +84,7 @@ _LIBCPP_PUSH_MACROS
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 template <class _Tp, class _Allocator /* = allocator<_Tp> */>
-class vector {
+class [[__gnu__::__warn_unused__]] vector {
   using _SplitBuffer _LIBCPP_NODEBUG = std::__split_buffer<_Tp, _Allocator, __split_buffer_pointer_layout>;
 
 public:
diff --git a/libcxx/include/__vector/vector_bool.h b/libcxx/include/__vector/vector_bool.h
index f73e086478a70..ad13678e2262b 100644
--- a/libcxx/include/__vector/vector_bool.h
+++ b/libcxx/include/__vector/vector_bool.h
@@ -77,7 +77,7 @@ struct __has_storage_type<vector<bool, _Allocator> > {
 };
 
 template <class _Allocator>
-class vector<bool, _Allocator> {
+class [[__gnu__::__warn_unused__]] vector<bool, _Allocator> {
 public:
   using __self _LIBCPP_NODEBUG         = vector;
   using value_type                     = bool;
diff --git a/libcxx/include/deque b/libcxx/include/deque
index bf589b05aef72..bcb91a52abbb8 100644
--- a/libcxx/include/deque
+++ b/libcxx/include/deque
@@ -282,7 +282,7 @@ template <class _ValueType,
               __deque_block_size<_ValueType, _DiffType>::value
 #  endif
           >
-class __deque_iterator {
+class [[__gnu__::__warn_unused__]] __deque_iterator {
   using __map_iterator _LIBCPP_NODEBUG = __rebind_pointer_t<_Pointer, const __rebind_pointer_t<_Pointer, _ValueType> >;
 
 // TODO(LLVM 25): Remove this check
@@ -495,7 +495,7 @@ const _DiffType __deque_iterator<_ValueType, _Pointer, _Reference, _MapPointer,
     __deque_block_size<_ValueType, _DiffType>::value;
 
 template <class _Tp, class _Allocator /*= allocator<_Tp>*/>
-class deque {
+class [[__gnu__::__warn_unused__]] deque {
   template <class _Up, class _Alloc>
   using __split_buffer _LIBCPP_NODEBUG = std::__split_buffer<_Up, _Alloc, __split_buffer_pointer_layout>;
 
diff --git a/libcxx/include/forward_list b/libcxx/include/forward_list
index 6d86f7a8e5975..ae90c278c4c77 100644
--- a/libcxx/include/forward_list
+++ b/libcxx/include/forward_list
@@ -336,7 +336,7 @@ template <class _NodeConstPtr>
 class __forward_list_const_iterator;
 
 template <class _NodePtr>
-class __forward_list_iterator {
+class [[__gnu__::__warn_unused__]] __forward_list_iterator {
   typedef __forward_node_traits<_NodePtr> __traits;
   typedef typename __traits::__node_type __node_type;
   typedef typename __traits::__begin_node __begin_node_type;
@@ -396,7 +396,7 @@ public:
 };
 
 template <class _NodeConstPtr>
-class __forward_list_const_iterator {
+class [[__gnu__::__warn_unused__]] __forward_list_const_iterator {
   static_assert(!is_const<typename pointer_traits<_NodeConstPtr>::element_type>::value, "");
   typedef _NodeConstPtr _NodePtr;
 
@@ -625,7 +625,7 @@ _LIBCPP_CONSTEXPR_SINCE_CXX26 void __forward_list_base<_Tp, _Alloc>::clear() _NO
 }
 
 template <class _Tp, class _Alloc /*= allocator<_Tp>*/>
-class forward_list : private __forward_list_base<_Tp, _Alloc> {
+class [[__gnu__::__warn_unused__]] forward_list : private __forward_list_base<_Tp, _Alloc> {
   typedef __forward_list_base<_Tp, _Alloc> __base;
   typedef typename __base::__node_allocator __node_allocator;
   typedef typename __base::__node_type __node_type;
diff --git a/libcxx/include/list b/libcxx/include/list
index 3223f25e1cfba..814faa8ab7a64 100644
--- a/libcxx/include/list
+++ b/libcxx/include/list
@@ -344,7 +344,7 @@ template <class _Tp, class _VoidPtr>
 class __list_const_iterator;
 
 template <class _Tp, class _VoidPtr>
-class __list_iterator {
+class [[__gnu__::__warn_unused__]] __list_iterator {
   typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits;
   typedef typename _NodeTraits::__base_pointer __base_pointer;
 
@@ -407,7 +407,7 @@ public:
 };
 
 template <class _Tp, class _VoidPtr>
-class __list_const_iterator {
+class [[__gnu__::__warn_unused__]] __list_const_iterator {
   typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits;
   typedef typename _NodeTraits::__base_pointer __base_pointer;
 
@@ -672,7 +672,7 @@ _LIBCPP_CONSTEXPR_SINCE_CXX26 void __list_imp<_Tp, _Alloc>::swap(__list_imp& __c
 }
 
 template <class _Tp, class _Alloc /*= allocator<_Tp>*/>
-class list : private __list_imp<_Tp, _Alloc> {
+class [[__gnu__::__warn_unused__]] list : private __list_imp<_Tp, _Alloc> {
   typedef __list_imp<_Tp, _Alloc> __base;
   typedef typename __base::__node_type __node_type;
   typedef typename __base::__node_allocator __node_allocator;
diff --git a/libcxx/include/map b/libcxx/include/map
index c983a3ed07cd4..1d5d88b9f407e 100644
--- a/libcxx/include/map
+++ b/libcxx/include/map
@@ -776,7 +776,7 @@ template <class _Key, class _Tp>
 struct __value_type;
 
 template <class _TreeIterator>
-class __map_iterator {
+class [[__gnu__::__warn_unused__]] __map_iterator {
   _TreeIterator __i_;
 
 public:
@@ -853,7 +853,7 @@ struct __specialized_algorithm<_Alg, __iterator_pair<__map_iterator<_TreeIterato
 #  endif
 
 template <class _TreeIterator>
-class __map_const_iterator {
+class [[__gnu__::__warn_unused__]] __map_const_iterator {
   _TreeIterator __i_;
 
 public:
@@ -937,7 +937,7 @@ template <class _Key, class _Tp, class _Compare = less<_Key>, class _Allocator =
 class multimap;
 
 template <class _Key, class _Tp, class _Compare = less<_Key>, class _Allocator = allocator<pair<const _Key, _Tp> > >
-class map {
+class [[__gnu__::__warn_unused__]] map {
 public:
   // types:
   typedef _Key key_type;
@@ -1718,7 +1718,7 @@ struct __container_traits<map<_Key, _Tp, _Compare, _Allocator> > {
 };
 
 template <class _Key, class _Tp, class _Compare, class _Allocator>
-class multimap {
+class [[__gnu__::__warn_unused__]] multimap {
 public:
   // types:
   typedef _Key key_type;
diff --git a/libcxx/include/set b/libcxx/include/set
index 3f2d2cd164d2d..6e078f297307e 100644
--- a/libcxx/include/set
+++ b/libcxx/include/set
@@ -573,7 +573,7 @@ template <class _Key, class _Compare = less<_Key>, class _Allocator = allocator<
 class multiset;
 
 template <class _Key, class _Compare = less<_Key>, class _Allocator = allocator<_Key> >
-class set {
+class [[__gnu__::__warn_unused__]] set {
 public:
   // types:
   typedef _Key key_type;
@@ -1064,7 +1064,7 @@ struct __container_traits<set<_Key, _Compare, _Allocator> > {
 };
 
 template <class _Key, class _Compare, class _Allocator>
-class multiset {
+class [[__gnu__::__warn_unused__]] multiset {
 public:
   // types:
   typedef _Key key_type;
diff --git a/libcxx/include/string b/libcxx/include/string
index a201d2ca44354..e618ab0321158 100644
--- a/libcxx/include/string
+++ b/libcxx/include/string
@@ -730,7 +730,7 @@ template <>
 struct __padding<0> {};
 
 template <class _CharT, class _Traits, class _Allocator>
-class basic_string {
+class [[__gnu__::__warn_unused__]] basic_string {
 public:
   using __self _LIBCPP_NODEBUG         = basic_string;
   using __self_view _LIBCPP_NODEBUG    = basic_string_view<_CharT, _Traits>;
diff --git a/libcxx/include/unordered_map b/libcxx/include/unordered_map
index 8cefba01fb5f6..ae449f823e45e 100644
--- a/libcxx/include/unordered_map
+++ b/libcxx/include/unordered_map
@@ -769,7 +769,7 @@ template <class _Key, class _Tp>
 struct __hash_value_type;
 
 template <class _HashIterator>
-class __hash_map_iterator {
+class [[__gnu__::__warn_unused__]] __hash_map_iterator {
   _HashIterator __i_;
 
   typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
@@ -820,7 +820,7 @@ public:
 };
 
 template <class _HashIterator>
-class __hash_map_const_iterator {
+class [[__gnu__::__warn_unused__]] __hash_map_const_iterator {
   _HashIterator __i_;
 
   typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
@@ -881,7 +881,7 @@ template <class _Key,
           class _Hash  = hash<_Key>,
           class _Pred  = equal_to<_Key>,
           class _Alloc = allocator<pair<const _Key, _Tp> > >
-class unordered_map {
+class [[__gnu__::__warn_unused__]] unordered_map {
 public:
   // types
   typedef _Key key_type;
@@ -1678,7 +1678,7 @@ template <class _Key,
           class _Hash  = hash<_Key>,
           class _Pred  = equal_to<_Key>,
           class _Alloc = allocator<pair<const _Key, _Tp> > >
-class unordered_multimap {
+class [[__gnu__::__warn_unused__]] unordered_multimap {
 public:
   // types
   typedef _Key key_type;
diff --git a/libcxx/include/unordered_set b/libcxx/include/unordered_set
index d54d59403b038..9ec85dcac18bd 100644
--- a/libcxx/include/unordered_set
+++ b/libcxx/include/unordered_set
@@ -591,7 +591,7 @@ template <class _Value, class _Hash, class _Pred, class _Alloc>
 class unordered_multiset;
 
 template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>, class _Alloc = allocator<_Value> >
-class unordered_set {
+class [[__gnu__::__warn_unused__]] unordered_set {
 public:
   // types
   typedef _Value key_type;
@@ -1207,7 +1207,7 @@ struct __container_traits<unordered_set<_Value, _Hash, _Pred, _Alloc> > {
 };
 
 template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>, class _Alloc = allocator<_Value> >
-class unordered_multiset {
+class [[__gnu__::__warn_unused__]] unordered_multiset {
 public:
   // types
   typedef _Value key_type;
diff --git a/libcxx/test/benchmarks/containers/sequence/sequence_container_benchmarks.h b/libcxx/test/benchmarks/containers/sequence/sequence_container_benchmarks.h
index 92346c38563fb..08c54320172ed 100644
--- a/libcxx/test/benchmarks/containers/sequence/sequence_container_benchmarks.h
+++ b/libcxx/test/benchmarks/containers/sequence/sequence_container_benchmarks.h
@@ -333,7 +333,6 @@ void sequence_container_benchmarks(std::string container) {
           };
 
           std::vector<Container> c(BatchSize, at_capacity(Container(in.begin(), in.end())));
-          std::vector<Container> const original = c;
 
           while (st.KeepRunningBatch(BatchSize)) {
             for (std::size_t i = 0; i != BatchSize; ++i) {
diff --git a/libcxx/test/libcxx/containers/associative/non_const_comparator.incomplete.verify.cpp b/libcxx/test/libcxx/containers/associative/non_const_comparator.incomplete.verify.cpp
index bae78ba4b78c6..7b8aec8b7cd17 100644
--- a/libcxx/test/libcxx/containers/associative/non_const_comparator.incomplete.verify.cpp
+++ b/libcxx/test/libcxx/containers/associative/non_const_comparator.incomplete.verify.cpp
@@ -33,6 +33,7 @@ void test_set() {
   struct KeyDerived : KeyBase {};
 
   C c; // ODR use it, which should be OK
+  (void)c;
 }
 
 template <template <typename...> class Container>
@@ -45,6 +46,7 @@ void test_map() {
   (void)dummy;
   struct KeyDerived : KeyBase {};
   C c;
+  (void)c;
 }
 
 void f() {
diff --git a/libcxx/test/libcxx/containers/associative/non_const_comparator.verify.cpp b/libcxx/test/libcxx/containers/associative/non_const_comparator.verify.cpp
index cb7a044abd8c0..6bf6e903a3cb0 100644
--- a/libcxx/test/libcxx/containers/associative/non_const_comparator.verify.cpp
+++ b/libcxx/test/libcxx/containers/associative/non_const_comparator.verify.cpp
@@ -32,17 +32,21 @@ void f() {
   {
     using C = std::set<int, BadCompare>;
     C s;
+    (void)s;
   }
   {
     using C = std::multiset<long, BadCompare>;
     C s;
+    (void)s;
   }
   {
     using C = std::map<int, int, BadCompare>;
     C s;
+    (void)s;
   }
   {
     using C = std::multimap<long, int, BadCompare>;
     C s;
+    (void)s;
   }
 }
diff --git a/libcxx/test/libcxx/containers/sequences/vector/robust_against_adl.pass.cpp b/libcxx/test/libcxx/containers/sequences/vector/robust_against_adl.pass.cpp
index c6868ce4cb867..db1e92dea55fe 100644
--- a/libcxx/test/libcxx/containers/sequences/vector/robust_against_adl.pass.cpp
+++ b/libcxx/test/libcxx/containers/sequences/vector/robust_against_adl.pass.cpp
@@ -34,6 +34,7 @@ struct MyAlloc {
 
 int main(int, char**) {
   std::vector<bool, MyAlloc<bool>> vb;
+  (void)vb;
   // std::fill_n triggers ADL because __bit_iterator has the container type as a template argument
   // std::vector<bool, MyAlloc<bool>> wb(100);
 
diff --git a/libcxx/test/libcxx/containers/unord/non_const_comparator.incomplete.verify.cpp b/libcxx/test/libcxx/containers/unord/non_const_comparator.incomplete.verify.cpp
index c370cd65085a1..90b43688de7c5 100644
--- a/libcxx/test/libcxx/containers/unord/non_const_comparator.incomplete.verify.cpp
+++ b/libcxx/test/libcxx/containers/unord/non_const_comparator.incomplete.verify.cpp
@@ -35,6 +35,7 @@ void test_set() {
   struct KeyDerived : KeyBase {};
 
   C c; // ODR use it, which should be OK
+  (void)c;
 }
 
 template <template <typename...> class Container>
@@ -47,6 +48,7 @@ void test_map() {
   (void)dummy;
   struct KeyDerived : KeyBase {};
   C c;
+  (void)c;
 }
 
 void f() {
diff --git a/libcxx/test/libcxx/containers/unord/non_const_comparator.verify.cpp b/libcxx/test/libcxx/containers/unord/non_const_comparator.verify.cpp
index c3418302d0315..d758378d82fa8 100644
--- a/libcxx/test/libcxx/containers/unord/non_const_comparator.verify.cpp
+++ b/libcxx/test/libcxx/containers/unord/non_const_comparator.verify.cpp
@@ -42,17 +42,21 @@ void f() {
   {
     using C = std::unordered_set<int, BadHash, BadEqual>;
     C s;
+    (void)s;
   }
   {
     using C = std::unordered_multiset<long, BadHash, BadEqual>;
     C s;
+    (void)s;
   }
   {
     using C = std::unordered_map<int, int, BadHash, BadEqual>;
     C s;
+    (void)s;
   }
   {
     using C = std::unordered_multimap<long, int, BadHash, BadEqual>;
     C s;
+    (void)s;
   }
 }
diff --git a/libcxx/test/libcxx/containers/unord/unord.set/missing_hash_specialization.verify.cpp b/libcxx/test/libcxx/containers/unord/unord.set/missing_hash_specialization.verify.cpp
index c66496acc6d07..a63a6200c39a0 100644
--- a/libcxx/test/libcxx/containers/unord/unord.set/missing_hash_specialization.verify.cpp
+++ b/libcxx/test/libcxx/containers/unord/unord.set/missing_hash_specialization.verify.cpp
@@ -47,6 +47,7 @@ int main(int, char**) {
   {
     using Set = std::unordered_set<VT>;
     Set s; // expected-error at __hash_table:* {{the specified hash does not meet the Hash requirements}}
+    (void)s;
 
     // FIXME: It would be great to suppress the below diagnostic all together.
     //        but for now it's sufficient that it appears last. However there is
@@ -56,14 +57,17 @@ int main(int, char**) {
   {
     using Set = std::unordered_set<int, BadHashNoCopy>;
     Set s; // expected-error at __hash_table:* {{the specified hash does not meet the Hash requirements}}
+    (void)s;
   }
   {
     using Set = std::unordered_set<int, BadHashNoCall>;
     Set s; // expected-error at __hash_table:* {{the specified hash does not meet the Hash requirements}}
+    (void)s;
   }
   {
     using Set = std::unordered_set<int, GoodHashNoDefault>;
     Set s(/*bucketcount*/ 42, GoodHashNoDefault(nullptr));
+    (void)s;
   }
 
   return 0;
diff --git a/libcxx/test/libcxx/diagnostics/unused_variables.verify.cpp b/libcxx/test/libcxx/diagnostics/unused_variables.verify.cpp
new file mode 100644
index 0000000000000..dc09ed8edd038
--- /dev/null
+++ b/libcxx/test/libcxx/diagnostics/unused_variables.verify.cpp
@@ -0,0 +1,68 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include <deque>
+#include <forward_list>
+#include <list>
+#include <map>
+#include <set>
+#include <string>
+#include <unordered_map>
+#include <unordered_set>
+#include <vector>
+
+void containers() {
+  std::deque<int> a;                   // expected-warning {{unused variable}}
+  std::forward_list<int> b;            // expected-warning {{unused variable}}
+  std::list<int> c;                    // expected-warning {{unused variable}}
+  std::map<int, int> d;                // expected-warning {{unused variable}}
+  std::multimap<int, int> e;           // expected-warning {{unused variable}}
+  std::set<int> f;                     // expected-warning {{unused variable}}
+  std::multiset<int> g;                // expected-warning {{unused variable}}
+  std::unordered_map<int, int> h;      // expected-warning {{unused variable}}
+  std::unordered_multimap<int, int> i; // expected-warning {{unused variable}}
+  std::unordered_set<int> j;           // expected-warning {{unused variable}}
+  std::unordered_multiset<int> k;      // expected-warning {{unused variable}}
+  std::string l;                       // expected-warning {{unused variable}}
+  std::vector<int> m;                  // expected-warning {{unused variable}}
+  std::vector<bool> n;                 // expected-warning {{unused variable}}
+}
+
+void container_iterators() {
+  std::deque<int>::iterator a;                   // expected-warning {{unused variable}}
+  std::forward_list<int>::iterator b;            // expected-warning {{unused variable}}
+  std::list<int>::iterator c;                    // expected-warning {{unused variable}}
+  std::map<int, int>::iterator d;                // expected-warning {{unused variable}}
+  std::multimap<int, int>::iterator e;           // expected-warning {{unused variable}}
+  std::set<int>::iterator f;                     // expected-warning {{unused variable}}
+  std::multiset<int>::iterator g;                // expected-warning {{unused variable}}
+  std::unordered_map<int, int>::iterator h;      // expected-warning {{unused variable}}
+  std::unordered_multimap<int, int>::iterator i; // expected-warning {{unused variable}}
+  std::unordered_set<int>::iterator j;           // expected-warning {{unused variable}}
+  std::unordered_multiset<int>::iterator k;      // expected-warning {{unused variable}}
+  std::string::iterator l;                       // expected-warning {{unused variable}}
+  std::vector<int>::iterator m;                  // expected-warning {{unused variable}}
+  std::vector<bool>::iterator n;                 // expected-warning {{unused variable}}
+}
+
+void container_const_iterators() {
+  std::deque<int>::const_iterator a;                   // expected-warning {{unused variable}}
+  std::for...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/203084


More information about the libcxx-commits mailing list