From 655ba783f8b2c9a8c3f4edb45e6db468aca22188 Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Tue, 17 Jan 2017 18:03:35 +0100 Subject: Defer set-to-zero in triangular = product so that no aliasing issue occur in the common: A.triangularView() = B*A.sefladjointView()*B.adjoint() case that used to work in 3.2. --- test/product_mmtr.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'test/product_mmtr.cpp') diff --git a/test/product_mmtr.cpp b/test/product_mmtr.cpp index b66529acd..f6e4bb1ae 100644 --- a/test/product_mmtr.cpp +++ b/test/product_mmtr.cpp @@ -62,6 +62,19 @@ template void mmtr(int size) CHECK_MMTR(matc, Upper, -= (s*sqc).template triangularView()*sqc); CHECK_MMTR(matc, Lower, = (s*sqr).template triangularView()*sqc); CHECK_MMTR(matc, Upper, += (s*sqc).template triangularView()*sqc); + + // check aliasing + ref2 = ref1 = matc; + ref1 = sqc.adjoint() * matc * sqc; + ref2.template triangularView() = ref1.template triangularView(); + matc.template triangularView() = sqc.adjoint() * matc * sqc; + VERIFY_IS_APPROX(matc, ref2); + + ref2 = ref1 = matc; + ref1 = sqc * matc * sqc.adjoint(); + ref2.template triangularView() = ref1.template triangularView(); + matc.template triangularView() = sqc * matc * sqc.adjoint(); + VERIFY_IS_APPROX(matc, ref2); } void test_product_mmtr() -- cgit v1.2.3