From a325ebd4c734dfab044a72258bb2b4f7589cf5e8 Mon Sep 17 00:00:00 2001 From: conrad Date: Tue, 10 May 2022 16:13:50 +1000 Subject: [PATCH] fix aliasing bugs --- include/armadillo_bits/glue_solve_meat.hpp | 32 ++++++++++++++++------ 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/include/armadillo_bits/glue_solve_meat.hpp b/include/armadillo_bits/glue_solve_meat.hpp index f96856bd..aa831b42 100644 --- a/include/armadillo_bits/glue_solve_meat.hpp +++ b/include/armadillo_bits/glue_solve_meat.hpp @@ -399,13 +399,21 @@ glue_solve_tri_default::apply(Mat& actual_out, const Base& A_expr, co if(triu) { arma_extra_debug_print("triu"); } if(tril) { arma_extra_debug_print("tril"); } - const quasi_unwrap U(A_expr.get_ref()); - const Mat& A = U.M; + const quasi_unwrap UA(A_expr.get_ref()); + const Mat& A = UA.M; arma_debug_check( (A.is_square() == false), "solve(): matrix marked as triangular must be square sized" ); - const uword layout = (triu) ? uword(0) : uword(1); - const bool is_alias = U.is_alias(actual_out); + const uword layout = (triu) ? uword(0) : uword(1); + + bool is_alias = true; + + if(is_Mat::value) + { + const quasi_unwrap UB(B_expr.get_ref()); + + is_alias = UA.is_alias(actual_out) || UB.is_alias(actual_out); + } T rcond = T(0); bool status = false; @@ -512,13 +520,21 @@ glue_solve_tri_full::apply(Mat& actual_out, const Base& A_expr, const if(likely_sympd) { arma_debug_warn_level(2, "solve(): option 'likely_sympd' ignored for triangular matrix"); } - const quasi_unwrap U(A_expr.get_ref()); - const Mat& A = U.M; + const quasi_unwrap UA(A_expr.get_ref()); + const Mat& A = UA.M; arma_debug_check( (A.is_square() == false), "solve(): matrix marked as triangular must be square sized" ); - const uword layout = (triu) ? uword(0) : uword(1); - const bool is_alias = U.is_alias(actual_out); + const uword layout = (triu) ? uword(0) : uword(1); + + bool is_alias = true; + + if(is_Mat::value) + { + const quasi_unwrap UB(B_expr.get_ref()); + + is_alias = UA.is_alias(actual_out) || UB.is_alias(actual_out); + } T rcond = T(0); bool status = false;