mirror of
https://gitlab.com/libeigen/eigen.git
synced 2024-12-21 07:19:46 +08:00
Fix boolean float conversion and product warnings.
This fixes some gcc warnings such as: ``` Eigen/src/Core/GenericPacketMath.h:655:63: warning: implicit conversion turns floating-point number into bool: 'typename __gnu_cxx::__enable_if<__is_integer<bool>::__value, double>::__type' (aka 'double') to 'bool' [-Wimplicit-conversion-floating-point-to-bool] Packet psqrt(const Packet& a) { EIGEN_USING_STD(sqrt); return sqrt(a); } ``` Details: - Added `scalar_sqrt_op<bool>` (`-Wimplicit-conversion-floating-point-to-bool`). - Added `scalar_square_op<bool>` and `scalar_cube_op<bool>` specializations (`-Wint-in-bool-context`) - Deprecated above specialized ops for bool. - Modified `cxx11_tensor_block_eval` to specialize generator for booleans (`-Wint-in-bool-context`) and to use `abs` instead of `square` to avoid deprecated bool ops.
This commit is contained in:
parent
a3b300f1af
commit
22f67b5958
@ -1374,6 +1374,11 @@ T sqrt(const T &x)
|
||||
return sqrt(x);
|
||||
}
|
||||
|
||||
// Boolean specialization, avoids implicit float to bool conversion (-Wimplicit-conversion-floating-point-to-bool).
|
||||
template<>
|
||||
EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_DEVICE_FUNC
|
||||
bool sqrt<bool>(const bool &x) { return x; }
|
||||
|
||||
#if defined(SYCL_DEVICE_ONLY)
|
||||
SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(sqrt, sqrt)
|
||||
#endif
|
||||
|
@ -99,6 +99,9 @@ Packet4f psqrt<Packet4f>(const Packet4f& x) { return _mm_sqrt_ps(x); }
|
||||
template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
|
||||
Packet2d psqrt<Packet2d>(const Packet2d& x) { return _mm_sqrt_pd(x); }
|
||||
|
||||
template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
|
||||
Packet16b psqrt<Packet16b>(const Packet16b& x) { return x; }
|
||||
|
||||
#if EIGEN_FAST_MATH
|
||||
|
||||
template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
|
||||
|
@ -218,7 +218,8 @@ template<> struct packet_traits<bool> : default_packet_traits
|
||||
HasAbs2 = 0,
|
||||
HasMin = 0,
|
||||
HasMax = 0,
|
||||
HasConj = 0
|
||||
HasConj = 0,
|
||||
HasSqrt = 1
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -422,6 +422,18 @@ struct functor_traits<scalar_sqrt_op<Scalar> > {
|
||||
};
|
||||
};
|
||||
|
||||
// Boolean specialization to eliminate -Wimplicit-conversion-floating-point-to-bool warnings.
|
||||
template<> struct scalar_sqrt_op<bool> {
|
||||
EIGEN_EMPTY_STRUCT_CTOR(scalar_sqrt_op)
|
||||
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator() (const bool& a) const { return a; }
|
||||
template <typename Packet>
|
||||
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return a; }
|
||||
};
|
||||
template <>
|
||||
struct functor_traits<scalar_sqrt_op<bool> > {
|
||||
enum { Cost = 1, PacketAccess = packet_traits<bool>::Vectorizable };
|
||||
};
|
||||
|
||||
/** \internal
|
||||
* \brief Template functor to compute the reciprocal square root of a scalar
|
||||
* \sa class CwiseUnaryOp, Cwise::rsqrt()
|
||||
@ -719,6 +731,19 @@ template<typename Scalar>
|
||||
struct functor_traits<scalar_square_op<Scalar> >
|
||||
{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
|
||||
|
||||
// Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
|
||||
template<>
|
||||
struct scalar_square_op<bool> {
|
||||
EIGEN_EMPTY_STRUCT_CTOR(scalar_square_op)
|
||||
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator() (const bool& a) const { return a; }
|
||||
template<typename Packet>
|
||||
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
|
||||
{ return a; }
|
||||
};
|
||||
template<>
|
||||
struct functor_traits<scalar_square_op<bool> >
|
||||
{ enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable }; };
|
||||
|
||||
/** \internal
|
||||
* \brief Template functor to compute the cube of a scalar
|
||||
* \sa class CwiseUnaryOp, Cwise::cube()
|
||||
@ -735,6 +760,19 @@ template<typename Scalar>
|
||||
struct functor_traits<scalar_cube_op<Scalar> >
|
||||
{ enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
|
||||
|
||||
// Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
|
||||
template<>
|
||||
struct scalar_cube_op<bool> {
|
||||
EIGEN_EMPTY_STRUCT_CTOR(scalar_cube_op)
|
||||
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator() (const bool& a) const { return a; }
|
||||
template<typename Packet>
|
||||
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
|
||||
{ return a; }
|
||||
};
|
||||
template<>
|
||||
struct functor_traits<scalar_cube_op<bool> >
|
||||
{ enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable }; };
|
||||
|
||||
/** \internal
|
||||
* \brief Template functor to compute the rounded value of a scalar
|
||||
* \sa class CwiseUnaryOp, ArrayBase::round()
|
||||
|
@ -222,7 +222,7 @@ static void test_eval_tensor_unary_expr_block() {
|
||||
input.setRandom();
|
||||
|
||||
VerifyBlockEvaluator<T, NumDims, Layout>(
|
||||
input.square(), [&dims]() { return RandomBlock<Layout>(dims, 1, 10); });
|
||||
input.abs(), [&dims]() { return RandomBlock<Layout>(dims, 1, 10); });
|
||||
}
|
||||
|
||||
template <typename T, int NumDims, int Layout>
|
||||
@ -274,7 +274,7 @@ static void test_eval_tensor_broadcast() {
|
||||
// Check that desc.destination() memory is not shared between two broadcast
|
||||
// materializations.
|
||||
VerifyBlockEvaluator<T, NumDims, Layout>(
|
||||
input.broadcast(bcast) * input.square().broadcast(bcast),
|
||||
input.broadcast(bcast) * input.abs().broadcast(bcast),
|
||||
[&bcasted_dims]() { return SkewedInnerBlock<Layout>(bcasted_dims); });
|
||||
}
|
||||
|
||||
@ -391,27 +391,46 @@ static void test_eval_tensor_chipping() {
|
||||
|
||||
// Block expression assignment.
|
||||
VerifyBlockEvaluator<T, NumDims - 1, Layout>(
|
||||
input.square().chip(chip_offset, chip_dim),
|
||||
input.abs().chip(chip_offset, chip_dim),
|
||||
[&chipped_dims]() { return FixedSizeBlock(chipped_dims); });
|
||||
|
||||
VerifyBlockEvaluator<T, NumDims - 1, Layout>(
|
||||
input.square().chip(chip_offset, chip_dim),
|
||||
input.abs().chip(chip_offset, chip_dim),
|
||||
[&chipped_dims]() { return RandomBlock<Layout>(chipped_dims, 1, 10); });
|
||||
}
|
||||
|
||||
|
||||
template<typename T, int NumDims>
|
||||
struct SimpleTensorGenerator {
|
||||
T operator()(const array<Index, NumDims>& coords) const {
|
||||
T result = static_cast<T>(0);
|
||||
for (int i = 0; i < NumDims; ++i) {
|
||||
result += static_cast<T>((i + 1) * coords[i]);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
// Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
|
||||
template<int NumDims>
|
||||
struct SimpleTensorGenerator<bool, NumDims> {
|
||||
bool operator()(const array<Index, NumDims>& coords) const {
|
||||
bool result = false;
|
||||
for (int i = 0; i < NumDims; ++i) {
|
||||
result ^= coords[i];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template <typename T, int NumDims, int Layout>
|
||||
static void test_eval_tensor_generator() {
|
||||
DSizes<Index, NumDims> dims = RandomDims<NumDims>(10, 20);
|
||||
Tensor<T, NumDims, Layout> input(dims);
|
||||
input.setRandom();
|
||||
|
||||
auto generator = [](const array<Index, NumDims>& coords) -> T {
|
||||
T result = static_cast<T>(0);
|
||||
for (int i = 0; i < NumDims; ++i) {
|
||||
result += static_cast<T>((i + 1) * coords[i]);
|
||||
}
|
||||
return result;
|
||||
};
|
||||
auto generator = SimpleTensorGenerator<T, NumDims>();
|
||||
|
||||
VerifyBlockEvaluator<T, NumDims, Layout>(
|
||||
input.generate(generator), [&dims]() { return FixedSizeBlock(dims); });
|
||||
|
Loading…
Reference in New Issue
Block a user