re PR libstdc++/2054 (g++-3 rejects legal code, accepted by g++-2.95.2 (functors))
authorPhil Edwards <pme@gcc.gnu.org>
Thu, 3 Jan 2002 04:44:07 +0000 (04:44 +0000)
committerPhil Edwards <pme@gcc.gnu.org>
Thu, 3 Jan 2002 04:44:07 +0000 (04:44 +0000)
2002-01-02  Phil Edwards  <pme@gcc.gnu.org>

* include/bits/stl_algo.h (upper_bound, equal_range, binary_search):
Change concept checks, as with lower_bound and PR 2054.
* testsuite/ext/concept_checks.cc:  Expand test to include those.

From-SVN: r48492

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_algo.h
libstdc++-v3/testsuite/ext/concept_checks.cc

index d05e9599e149c5889abc35d0899e85132c6c4fc9..cf7f6bd8d173b7e1f297e703cdd746249cc41e7d 100644 (file)
@@ -1,3 +1,9 @@
+2002-01-02  Phil Edwards  <pme@gcc.gnu.org>
+
+       * include/bits/stl_algo.h (upper_bound, equal_range, binary_search):
+       Change concept checks, as with lower_bound and PR 2054.
+       * testsuite/ext/concept_checks.cc:  Expand test to include those.
+
 2002-01-02  Phil Edwards  <pme@gcc.gnu.org>
 
        * include/bits/boost_concept_check.h:  Import some changes from
index d5694b26f19ed2e831856ff688758e7a10d8ef22..e8e9845f822bbe983cb469557d5a48f0f96fb81e 100644 (file)
@@ -1,6 +1,6 @@
 // Algorithm implimentation -*- C++ -*-
 
-// Copyright (C) 2001 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -1949,6 +1949,10 @@ __result, __binary_pred, _IterType());
       typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
     
       // concept requirements
+      // Note that these are slightly stricter than those of the 4-argument
+      // version, defined next.  The difference is in the strictness of the
+      // comparison operations... so for looser checking, define your own
+      // comparison function, as was intended.
       __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
       __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
       __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
@@ -2011,6 +2015,7 @@ __result, __binary_pred, _IterType());
       typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
       
       // concept requirements
+      // See comments on lower_bound.
       __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
       __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
       __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
@@ -2044,8 +2049,7 @@ __result, __binary_pred, _IterType());
       
       // concept requirements
       __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
-      __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
-      __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>)
+      __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _ValueType>)
     
       _DistanceType __len = distance(__first, __last);
       _DistanceType __half;
@@ -2074,6 +2078,7 @@ __result, __binary_pred, _IterType());
       typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
       
       // concept requirements
+      // See comments on lower_bound.
       __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
       __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
       __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
@@ -2113,8 +2118,8 @@ __result, __binary_pred, _IterType());
       
       // concept requirements
       __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
-      __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
-      __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>)
+      __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _ValueType, _Tp>)
+      __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _ValueType>)
     
       _DistanceType __len = distance(__first, __last);
       _DistanceType __half;
@@ -2147,6 +2152,7 @@ __result, __binary_pred, _IterType());
                   const _Tp& __val)
     {
       // concept requirements
+      // See comments on lower_bound.
       __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
       __glibcpp_function_requires(_SameTypeConcept<_Tp,
                typename iterator_traits<_ForwardIter>::value_type>)
@@ -2163,9 +2169,10 @@ __result, __binary_pred, _IterType());
     {
       // concept requirements
       __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
-      __glibcpp_function_requires(_SameTypeConcept<_Tp,
+      __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
+               typename iterator_traits<_ForwardIter>::value_type, _Tp>)
+      __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp,
                typename iterator_traits<_ForwardIter>::value_type>)
-      __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>)
 
       _ForwardIter __i = lower_bound(__first, __last, __val, __comp);
       return __i != __last && !__comp(__val, *__i);
index d07beba32877c23f9198ef040a5941e4912629d3..8109985d1ca31580efbcf7922e1d5de867c6897a 100644 (file)
@@ -1,6 +1,6 @@
 // 2001-12-28  Phil Edwards  <pme@gcc.gnu.org>
 //
-// Copyright (C) 2001 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -30,7 +30,7 @@
 using namespace std;
 
 
-// PR libstdc++/2054
+// PR libstdc++/2054 and follow-up discussion
 struct indirectCompare
 {
   indirectCompare(const vector<string>& v) : V(v) {}
@@ -45,6 +45,11 @@ struct indirectCompare
        return V[x] < a;
   }
 
+  bool operator()( const string& a, int x) const
+  {
+       return V[x] < a;
+  }
+
   const vector<string>& V;
 };
 
@@ -66,6 +71,9 @@ test2054( )
   string SearchTerm;
 
   lower_bound(Index.begin(), Index.end(), SearchTerm, aComparison);
+  upper_bound(Index.begin(), Index.end(), SearchTerm, aComparison);
+  equal_range(Index.begin(), Index.end(), SearchTerm, aComparison);
+  binary_search(Index.begin(), Index.end(), SearchTerm, aComparison);
 }
 
 int main()