diff --git a/Eigen/src/Core/Visitor.h b/Eigen/src/Core/Visitor.h index e1d2ca527..fa6293fea 100644 --- a/Eigen/src/Core/Visitor.h +++ b/Eigen/src/Core/Visitor.h @@ -317,6 +317,13 @@ class visitor_evaluator { const XprType& m_xpr; }; +template +struct visitor_has_linear_access : std::false_type {}; + +template +struct visitor_has_linear_access::LinearAccess)> + : std::integral_constant(functor_traits::LinearAccess)> {}; + template struct visit_impl { using Evaluator = visitor_evaluator; @@ -329,8 +336,7 @@ struct visit_impl { static constexpr int InnerSizeAtCompileTime = IsRowMajor ? ColsAtCompileTime : RowsAtCompileTime; static constexpr int OuterSizeAtCompileTime = IsRowMajor ? RowsAtCompileTime : ColsAtCompileTime; - static constexpr bool LinearAccess = - Evaluator::LinearAccess && static_cast(functor_traits::LinearAccess); + static constexpr bool LinearAccess = Evaluator::LinearAccess && visitor_has_linear_access::value; static constexpr bool Vectorize = Evaluator::PacketAccess && static_cast(functor_traits::PacketAccess); static constexpr int PacketSize = packet_traits::size; diff --git a/test/visitor.cpp b/test/visitor.cpp index 7c6d4ff19..27ca18415 100644 --- a/test/visitor.cpp +++ b/test/visitor.cpp @@ -239,7 +239,7 @@ namespace internal { template struct functor_traits> { - enum { PacketAccess = Vectorizable, LinearAccess = false, Cost = 1 }; + enum { PacketAccess = Vectorizable, Cost = 1 }; }; } // namespace internal