More debug info and use lazyProd instead of operator* to query the right flags
diff --git a/test/vectorization_logic.cpp b/test/vectorization_logic.cpp
index aee68a8..23be0ff 100644
--- a/test/vectorization_logic.cpp
+++ b/test/vectorization_logic.cpp
@@ -27,19 +27,43 @@
   if(t==CompleteUnrolling) return "CompleteUnrolling";
   return "?";
 }
+std::string demangle_flags(int f)
+{
+  std::string res;
+  if(f&RowMajorBit) res += " | RowMajor";
+  if(f&PacketAccessBit) res += " | Packet";
+  if(f&LinearAccessBit) res += " | Linear";
+  if(f&LvalueBit) res += " | Lvalue";
+  if(f&DirectAccessBit) res += " | Direct";
+  if(f&AlignedBit) res += " | Aligned";
+  if(f&NestByRefBit) res += " | NestByRef";
+  return res;
+}
 
 template<typename Dst, typename Src>
 bool test_assign(const Dst&, const Src&, int traversal, int unrolling)
 {
-  internal::assign_traits<Dst,Src>::debug();
-  bool res = internal::assign_traits<Dst,Src>::Traversal==traversal
-          && internal::assign_traits<Dst,Src>::Unrolling==unrolling;
+#ifdef EIGEN_TEST_EVALUATORS
+  typedef internal::copy_using_evaluator_traits<internal::evaluator<Dst>,internal::evaluator<Src>, internal::assign_op<typename Dst::Scalar> > traits;
+#else
+  typedef internal::assign_traits<Dst,Src> traits;
+#endif
+  bool res = traits::Traversal==traversal && traits::Unrolling==unrolling;
   if(!res)
   {
+    std::cerr << "Src: " << demangle_flags(Src::Flags) << std::endl;
+#ifdef EIGEN_TEST_EVALUATORS
+    std::cerr << "     " << demangle_flags(internal::evaluator<Src>::Flags) << std::endl;
+#endif
+    std::cerr << "Dst: " << demangle_flags(Dst::Flags) << std::endl;
+#ifdef EIGEN_TEST_EVALUATORS
+    std::cerr << "     " << demangle_flags(internal::evaluator<Dst>::Flags) << std::endl;
+#endif
+    traits::debug();
     std::cerr << " Expected Traversal == " << demangle_traversal(traversal)
-              << " got " << demangle_traversal(internal::assign_traits<Dst,Src>::Traversal) << "\n";
+              << " got " << demangle_traversal(traits::Traversal) << "\n";
     std::cerr << " Expected Unrolling == " << demangle_unrolling(unrolling)
-              << " got " << demangle_unrolling(internal::assign_traits<Dst,Src>::Unrolling) << "\n";
+              << " got " << demangle_unrolling(traits::Unrolling) << "\n";
   }
   return res;
 }
@@ -47,15 +71,27 @@
 template<typename Dst, typename Src>
 bool test_assign(int traversal, int unrolling)
 {
-  internal::assign_traits<Dst,Src>::debug();
-  bool res = internal::assign_traits<Dst,Src>::Traversal==traversal
-          && internal::assign_traits<Dst,Src>::Unrolling==unrolling;
+#ifdef EIGEN_TEST_EVALUATORS
+  typedef internal::copy_using_evaluator_traits<internal::evaluator<Dst>,internal::evaluator<Src>, internal::assign_op<typename Dst::Scalar> > traits;
+#else
+  typedef internal::assign_traits<Dst,Src> traits;
+#endif
+  bool res = traits::Traversal==traversal && traits::Unrolling==unrolling;
   if(!res)
   {
+    std::cerr << "Src: " << demangle_flags(Src::Flags) << std::endl;
+#ifdef EIGEN_TEST_EVALUATORS
+    std::cerr << "     " << demangle_flags(internal::evaluator<Src>::Flags) << std::endl;
+#endif
+    std::cerr << "Dst: " << demangle_flags(Dst::Flags) << std::endl;
+#ifdef EIGEN_TEST_EVALUATORS
+    std::cerr << "     " << demangle_flags(internal::evaluator<Dst>::Flags) << std::endl;
+#endif
+    traits::debug();
     std::cerr << " Expected Traversal == " << demangle_traversal(traversal)
-              << " got " << demangle_traversal(internal::assign_traits<Dst,Src>::Traversal) << "\n";
+              << " got " << demangle_traversal(traits::Traversal) << "\n";
     std::cerr << " Expected Unrolling == " << demangle_unrolling(unrolling)
-              << " got " << demangle_unrolling(internal::assign_traits<Dst,Src>::Unrolling) << "\n";
+              << " got " << demangle_unrolling(traits::Unrolling) << "\n";
   }
   return res;
 }
@@ -63,10 +99,21 @@
 template<typename Xpr>
 bool test_redux(const Xpr&, int traversal, int unrolling)
 {
+#ifdef EIGEN_TEST_EVALUATORS
+  typedef internal::redux_traits<internal::scalar_sum_op<typename Xpr::Scalar>,internal::redux_evaluator<Xpr> > traits;
+#else
   typedef internal::redux_traits<internal::scalar_sum_op<typename Xpr::Scalar>,Xpr> traits;
+#endif
+  
   bool res = traits::Traversal==traversal && traits::Unrolling==unrolling;
   if(!res)
   {
+    std::cerr << demangle_flags(Xpr::Flags) << std::endl;
+#ifdef EIGEN_TEST_EVALUATORS
+    std::cerr << demangle_flags(internal::evaluator<Xpr>::Flags) << std::endl;
+#endif
+    traits::debug();
+    
     std::cerr << " Expected Traversal == " << demangle_traversal(traversal)
               << " got " << demangle_traversal(traits::Traversal) << "\n";
     std::cerr << " Expected Unrolling == " << demangle_unrolling(unrolling)
@@ -185,7 +232,7 @@
             Matrix22
             >(DefaultTraversal,CompleteUnrolling)));
 
-    VERIFY((test_assign(Matrix11(), Matrix11()*Matrix11(), InnerVectorizedTraversal, CompleteUnrolling)));
+    VERIFY((test_assign(Matrix11(), Matrix11().lazyProduct(Matrix11()), InnerVectorizedTraversal, CompleteUnrolling)));
     #endif
 
     VERIFY(test_assign(MatrixXX(10,10),MatrixXX(20,20).block(10,10,2,3),