[cfe-dev] [libc++] possible bug?
Ovanes Markaryan
om_clang at keywallet.com
Sun Apr 22 13:37:13 PDT 2012
Hello *,
just tried to compile SYMPHONY-5.4.4 with clang 3.0 + libc++ (tag 31).
While compiling it I receive this error:
include/c++/v1/algorithm:643:97: error: invalid operands to binary
expression
('const reducedCost' and 'const reducedCost')
_LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1&
__y) const {return __x < __y;}
~~~ ^ ~~~
/home/ovanes/toolsets/clang-3.0/include/c++/v1/algorithm:4433:13: note: in
instantiation of member function 'std::__1::__less<reducedCost,
reducedCost>::operator()' requested here
if (__comp(*__ptr, *--__last))
^
/home/ovanes/toolsets/clang-3.0/include/c++/v1/algorithm:4524:13: note: in
instantiation of function template specialization
'std::__1::__push_heap_back<std::__1::__less<reducedCost,
reducedCost> &, reducedCost *>' requested here
__push_heap_back<_Compare>(__first, ++__last, __comp, ++__i);
^
/home/ovanes/toolsets/clang-3.0/include/c++/v1/algorithm:4539:5: note: in
instantiation of function template specialization
'std::__1::__make_heap<std::__1::__less<reducedCost, reducedCost> &,
reducedCost *>' requested here
__make_heap<_Comp_ref>(__first, __last, __comp);
^
/home/ovanes/toolsets/clang-3.0/include/c++/v1/algorithm:4548:5: note: in
instantiation of function template specialization
'std::__1::make_heap<reducedCost *, std::__1::__less<reducedCost,
reducedCost> >' requested here
_VSTD::make_heap(__first, __last, __less<typename
iterator_traits<_RandomAccessIterator>::value_type>());
^
/home/ovanes/toolsets/clang-3.0/include/c++/v1/__config:174:15: note:
expanded from:
#define _VSTD std::_LIBCPP_NAMESPACE
I stripped down a code example which reproduces the error. This is not my
code, this the code from the lib (please don't judge me when looking to it
;)
struct reducedCost
{
/** To avoid computing two times the same row direction will have
strange
values, direction is -1 or 1 if for only one of the two direction
rc is <0 and is -2 or 2 if the two direction have one <0 rc with the
sign
indicating which one of the two directions is the best.<br>
Note that by theory only one reduced cost (for u_i, or v_i)
maybe negative for each direction.
*/
int direction;
/** gammSign is the sign of gamma (corresponding to taking rc for u_i
or v_i)
for the best of the two rc for this row.*/
int gammaSign;
/** gammaSign2 is the sign of gamma for the worst of the two rc for
this row.*/
int gammaSign2;
/** if both reduced costs are <0 value is the smallest of the two.*/
double value;
/** greatest of the two reduced costs */
double value2;
/** index of the row.*/
int row;
bool operator<(const reducedCost & other)
{
return (value>other.value);
}
};
int main()
{
reducedCost r[100]={};
std::make_heap(&r[0], &r[0]+100);
return 0;
};
I think the problem results because std::less is not defined directly in
std namespace, but in std::__1 and was not properly introduced into the
std-Namespace? Because specializing std::less<reduceCost> still produces
the same error:
namespace std
{
template<>
struct less<reducedCost>
: ::std::binary_function<reducedCost, reducedCost, bool>
{
bool operator()(const reducedCost & lhs, const reducedCost &
rhs)const
{
return lhs.value>rhs.value;
}
};
}
But, if explicitly specializing std::less<reducedCost> as comparison
functor fixes the problem.
std::make_heap(&r[0], &r[0]+100, std::less<reducedCost>());
Thanks,
Ovanes
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20120422/f737a646/attachment.html>
More information about the cfe-dev
mailing list