Assigning a row-major declsym expression to a column-major symmetric submatrix results in a compiler error

Issue #283 resolved
Mikhail Katliar created an issue

Example:

SymmetricMatrix<DynamicMatrix<double, columnMajor>> A(5);
DynamicMatrix<double, rowMajor> R(1, 1);
submatrix<0, 0, 1, 1>(A) += declsym(R); // <-- ERROR

Compiler output:

In file included from /usr/local/include/blaze/math/expressions/Matrix.h:44,
                 from /usr/local/include/blaze/math/views/Band.h:52,
                 from /usr/local/include/blaze/math/Band.h:50,
                 from /usr/local/include/blaze/Math.h:46,
                 from test.cpp:1:
/usr/local/include/blaze/math/expressions/Matrix.h: In instantiation of ‘blaze::EnableIf_t<IsSymmetric_v<MT2> > blaze::assign_backend(blaze::Matrix<MT, SO>&, const blaze::Matrix<MT2, (! SO)>&) [with MT1 = blaze::Submatrix<blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >, (blaze::AlignmentFlag)0, true, true, 0, 0, 1, 1>; bool SO = true; MT2 = blaze::SymmetricMatrix<blaze::StaticMatrix<double, 1, 1, false>, false, true, true>; blaze::EnableIf_t<IsSymmetric_v<MT2> > = void]’:
/usr/local/include/blaze/math/expressions/Matrix.h:1101:18:   required from ‘void blaze::assign(blaze::Matrix<MT, SO>&, const blaze::Matrix<MT, SO>&) [with MT1 = blaze::Submatrix<blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >, (blaze::AlignmentFlag)0, true, true, 0, 0, 1, 1>; bool SO1 = true; MT2 = blaze::SymmetricMatrix<blaze::StaticMatrix<double, 1, 1, false>, false, true, true>; bool SO2 = false]’
/usr/local/include/blaze/math/smp/default/DenseMatrix.h:108:10:   required from ‘blaze::EnableIf_t<IsDenseMatrix_v<MT1> > blaze::smpAssign(blaze::Matrix<MT, SO>&, const blaze::Matrix<MT, SO>&) [with MT1 = blaze::Submatrix<blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >, (blaze::AlignmentFlag)0, true, true, 0, 0, 1, 1>; bool SO1 = true; MT2 = blaze::SymmetricMatrix<blaze::StaticMatrix<double, 1, 1, false>, false, true, true>; bool SO2 = false; blaze::EnableIf_t<IsDenseMatrix_v<MT1> > = void]’
/usr/local/include/blaze/math/views/submatrix/Dense.h:4765:16:   required from ‘blaze::DisableIf_t<EnforceEvaluation_v<MT, MT2>, blaze::Submatrix<MT, (blaze::AlignmentFlag)0, true, true, CSAs ...>&> blaze::Submatrix<MT, (blaze::AlignmentFlag)0, true, true, CSAs ...>::operator+=(const blaze::Matrix<MT, SO>&) [with MT2 = blaze::DMatDeclSymExpr<blaze::DynamicMatrix<double, false>, false>; bool SO = false; MT = blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >; long unsigned int ...CSAs = {0, 0, 1, 1}; blaze::DisableIf_t<EnforceEvaluation_v<MT, MT2>, blaze::Submatrix<MT, (blaze::AlignmentFlag)0, true, true, CSAs ...>&> = blaze::Submatrix<blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >, (blaze::AlignmentFlag)0, true, true, 0, 0, 1, 1>&]’
test.cpp:15:46:   required from here
/usr/local/include/blaze/math/expressions/Matrix.h:1065:4: error: static assertion failed: Symmetric matrix type detected
    BLAZE_CONSTRAINT_MUST_NOT_BE_SYMMETRIC_MATRIX_TYPE( MT1 );
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/blaze/math/expressions/Matrix.h: In instantiation of ‘blaze::EnableIf_t<IsSymmetric_v<MT2> > blaze::addAssign_backend(blaze::Matrix<MT, SO>&, const blaze::Matrix<MT2, (! SO)>&) [with MT1 = blaze::Submatrix<blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >, (blaze::AlignmentFlag)0, true, true, 0, 0, 1, 1>; bool SO = true; MT2 = blaze::DMatDeclSymExpr<blaze::DynamicMatrix<double, false>, false>; blaze::EnableIf_t<IsSymmetric_v<MT2> > = void]’:
/usr/local/include/blaze/math/expressions/Matrix.h:1210:21:   required from ‘void blaze::addAssign(blaze::Matrix<MT, SO>&, const blaze::Matrix<MT, SO>&) [with MT1 = blaze::Submatrix<blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >, (blaze::AlignmentFlag)0, true, true, 0, 0, 1, 1>; bool SO1 = true; MT2 = blaze::DMatDeclSymExpr<blaze::DynamicMatrix<double, false>, false>; bool SO2 = false]’
/usr/local/include/blaze/math/smp/default/DenseMatrix.h:139:13:   required from ‘blaze::EnableIf_t<IsDenseMatrix_v<MT1> > blaze::smpAddAssign(blaze::Matrix<MT, SO>&, const blaze::Matrix<MT, SO>&) [with MT1 = blaze::Submatrix<blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >, (blaze::AlignmentFlag)0, true, true, 0, 0, 1, 1>; bool SO1 = true; MT2 = blaze::DMatDeclSymExpr<blaze::DynamicMatrix<double, false>, false>; bool SO2 = false; blaze::EnableIf_t<IsDenseMatrix_v<MT1> > = void]’
/usr/local/include/blaze/math/views/submatrix/Dense.h:4768:19:   required from ‘blaze::DisableIf_t<EnforceEvaluation_v<MT, MT2>, blaze::Submatrix<MT, (blaze::AlignmentFlag)0, true, true, CSAs ...>&> blaze::Submatrix<MT, (blaze::AlignmentFlag)0, true, true, CSAs ...>::operator+=(const blaze::Matrix<MT, SO>&) [with MT2 = blaze::DMatDeclSymExpr<blaze::DynamicMatrix<double, false>, false>; bool SO = false; MT = blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >; long unsigned int ...CSAs = {0, 0, 1, 1}; blaze::DisableIf_t<EnforceEvaluation_v<MT, MT2>, blaze::Submatrix<MT, (blaze::AlignmentFlag)0, true, true, CSAs ...>&> = blaze::Submatrix<blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >, (blaze::AlignmentFlag)0, true, true, 0, 0, 1, 1>&]’
test.cpp:15:46:   required from here
/usr/local/include/blaze/math/expressions/Matrix.h:1174:4: error: static assertion failed: Symmetric matrix type detected
    BLAZE_CONSTRAINT_MUST_NOT_BE_SYMMETRIC_MATRIX_TYPE( MT1 );

If R is declared as columnMajor, the code compiles.

Comments (4)

  1. Klaus Iglberger

    Hi Misha!

    Thanks a lot for taking the time to report this defect. This is indeed an oversight on our side. We will fix the issue as quickly as possible. Thanks again,

    Best regards,

    Klaus!

  2. Klaus Iglberger

    Commit cc8016b fixes the compilation error during the assignment of a row-major symmetric matrix to a column-major symmetric submatrix. The fix is immediately available via cloning the Blaze repository and will be officially released in Blaze 3.7.

  3. Log in to comment