LessThanComparable requirement overspecified?
Matthew Austern
austern@research.att.com
Thu Jun 29 16:19:00 GMT 2000
Nope, not overkill; I haven't signed up on many mailing lists yet
with my new address.
This certainly does look like like a place where Jeremy and I put in
what we thought ought to be in the standard, rather than what was
really there.
--Matt
Benjamin Kosnik wrote:
>
> Matt I'm cc'ing you directly on this. Sorry if it's overkill.
>
> > I noticed that the latest update of the `STL' part of libstdc++
> > contains code to enforce the requirements on template parameters.
> > This is quite useful --- i've already found several instances in my
> > code where i was violating the spec.
>
> Yeah it seemed like a good idea to me too. I'm not quite sure the work to
> get clean error messages is worth it, but enforcing invariants and
> requirements is a great idea.
>
> Hey Gaby, any luck on getting human-readable error messages outta g++?
>
> > However, there are some places where the new code seems to be overspecifying
> > the requirements --- making demands not required by the C++ standard ---
> > thus causing code that i believe to be legal to fail to compile.
> >
> > Here is one example:
> >
> > -----------------------------------------------------------------------
> > #include <algorithm>
> >
> > struct foo {};
> >
> > bool operator== (const foo&, const foo&);
> > bool operator< (const foo&, const foo&);
> >
> > void bar (foo* a, foo* b, foo& x)
> > {
> > foo* c = std::lower_bound (a, b, x);
> > }
> >
> > -----------------------------------------------------------------------
> >
> > When i try to compile this, i get:
> >
> > /usr/local/egcs/include/g++-v3/bits/concept_checks.h: In function `_Type
> > _STL_ERROR::__less_than_comparable_requirement_violation (_Type, _Type) [with _Type = foo]':
> > /usr/local/egcs/include/g++-v3/bits/concept_checks.h:560: instantiated from `_LessThanComparable_concept_specification<_Type>::_LessThanComparable_requirement_violation (_Type) [with _Type = foo]'
> > /usr/local/egcs/include/g++-v3/bits/stl_algo.h:1945: instantiated from `std::lower_bound (_ForwardIter, _ForwardIter, const _Tp &) [with _ForwardIter = foo *, _Tp = foo]'
> > x.cc:10: instantiated from here
> > /usr/local/egcs/include/g++-v3/bits/concept_checks.h:396: no match for `foo & >= foo &'
> > /usr/local/egcs/include/g++-v3/bits/concept_checks.h:396: no match for `foo & <= foo &'
> > /usr/local/egcs/include/g++-v3/bits/concept_checks.h:396: no match for `foo & > foo &'
> >
> >
> > If i look at what __less_than_comparable_requirement is actually requiring:
> >
> > if (__a < __b || __a > __b || __a <= __b || __a >= __b) return __a;
> >
> > i.e., it requires the full suite of four inequality comparisons to be
> > present, not just `<'.
> >
> > The requirement in the standard is that the type be LessThanComparable.
> > According to 20.1.2, this requires only a `<' relation --- so i think
> > that the code above is correct.
>
> Hmm. Matt?
>
> >
> > This patch gets rid of the extra requirements, and allows the above
> > example to compile.
> >
> > 2000-06-29 scott snyder <snyder@fnal.gov>
> >
> > * bits/concept_checks.h
> > (__less_then_comparable_requirement_violation): Only check for <.
> >
> > Index: concept_checks.h
> > ===================================================================
> > RCS file: /cvs/gcc/egcs/libstdc++-v3/bits/concept_checks.h,v
> > retrieving revision 1.1
> > diff -u -p -c -p -r1.1 concept_checks.h
> > *** concept_checks.h 2000/06/27 23:08:37 1.1
> > --- concept_checks.h 2000/06/29 21:58:32
> > *************** struct _STL_ERROR {
> > *** 393,399 ****
> > template <class _Type>
> > static _Type
> > __less_than_comparable_requirement_violation(_Type __a, _Type __b) {
> > ! if (__a < __b || __a > __b || __a <= __b || __a >= __b) return __a;
> > return __b;
> > }
> > template <class _Type>
> > --- 393,399 ----
> > template <class _Type>
> > static _Type
> > __less_than_comparable_requirement_violation(_Type __a, _Type __b) {
> > ! if (__a < __b) return __a;
> > return __b;
> > }
> > template <class _Type>
> >
More information about the Libstdc++
mailing list