]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Fix regression in std::list::sort [PR66742]
authorJonathan Wakely <jwakely@redhat.com>
Tue, 2 Nov 2021 10:21:01 +0000 (10:21 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 3 Nov 2021 15:15:27 +0000 (15:15 +0000)
The standard does not require const-correct comparisons in list::sort.

libstdc++-v3/ChangeLog:

PR libstdc++/66742
* include/bits/list.tcc (list::sort): Use mutable iterators for
comparisons.
* include/bits/stl_list.h (_Scratch_list::_Ptr_cmp): Likewise.
* testsuite/23_containers/list/operations/66742.cc: Check
non-const comparisons.

libstdc++-v3/include/bits/list.tcc
libstdc++-v3/include/bits/stl_list.h
libstdc++-v3/testsuite/23_containers/list/operations/66742.cc

index 7f4e1569ab1a96e3e19ba07ad315ea891f04ae1d..cc750c98a2d81f85a648458ac6ee2625abc2b639 100644 (file)
@@ -499,7 +499,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        _Scratch_list* __fill = __tmp;
        _Scratch_list* __counter;
 
-       _Scratch_list::_Ptr_cmp<const_iterator, void> __ptr_comp;
+       _Scratch_list::_Ptr_cmp<iterator, void> __ptr_comp;
 
        __try
          {
@@ -623,7 +623,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
          _Scratch_list* __fill = __tmp;
          _Scratch_list* __counter;
 
-       _Scratch_list::_Ptr_cmp<const_iterator, _StrictWeakOrdering> __ptr_comp
+       _Scratch_list::_Ptr_cmp<iterator, _StrictWeakOrdering> __ptr_comp
          = { __comp };
 
          __try
index 96d2a2f0f69d71949e4e429e35a463f9594ff186..ffaaa6dfd97d835383ac8651ccd0044258c51882 100644 (file)
@@ -174,8 +174,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
          _Cmp _M_cmp;
 
          bool
-         operator()(const __detail::_List_node_base* __lhs,
-                    const __detail::_List_node_base* __rhs) /* not const */
+         operator()(__detail::_List_node_base* __lhs,
+                    __detail::_List_node_base* __rhs) /* not const */
          { return _M_cmp(*_Iter(__lhs), *_Iter(__rhs)); }
        };
 
@@ -183,8 +183,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        struct _Ptr_cmp<_Iter, void>
        {
          bool
-         operator()(const __detail::_List_node_base* __lhs,
-                    const __detail::_List_node_base* __rhs) const
+         operator()(__detail::_List_node_base* __lhs,
+                    __detail::_List_node_base* __rhs) const
          { return *_Iter(__lhs) < *_Iter(__rhs); }
        };
 
index 24bda3920d8961d6b6c1b3d3fa88b65654e6e326..94a37a31de7850f2bd1a0344176a367e4ab33d3d 100644 (file)
@@ -48,8 +48,31 @@ test01()
   VERIFY( is_sorted(l, std::greater<int>()) );
 }
 
+void
+test02()
+{
+  // The standard doesn't require comparisons to be const-correct.
+  // The initial fix for PR 66742 caused a regression here.
+
+  struct X
+  {
+    bool operator<(X&) /* non-const */ { return false; }
+  };
+
+  struct Cmp
+  {
+    bool operator()(X&, X&) /* non-const */ { return false; }
+  };
+
+  std::list<X> l;
+  l.sort();
+  Cmp c;
+  l.sort(c);
+}
+
 int
 main()
 {
   test01();
+  test02();
 }