[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