Fix GCC 13 array-bounds warning in TensorContraction

libeigen/eigen!2311

Closes #3017
This commit is contained in:
Pavel Guzenfeld
2026-03-19 03:08:21 +00:00
committed by Rasmus Munk Larsen
parent 05295a818b
commit 62e23f79dd

View File

@@ -490,11 +490,16 @@ struct TensorContractionEvaluatorBase {
if (dim_idx != i) {
m_lhs_inner_dim_contiguous = false;
}
// Suppress false-positive GCC -Warray-bounds warning at -O3 when
// left_nocontract_t has size 1 (the runtime check prevents OOB access).
EIGEN_DIAGNOSTICS(push)
EIGEN_DIAGNOSTICS_OFF(disable : 4789, ignored "-Warray-bounds")
if (nocontract_idx + 1 < internal::array_size<left_nocontract_t>::value) {
m_i_strides[nocontract_idx + 1] = m_i_strides[nocontract_idx] * eval_left_dims[i];
} else {
m_i_size = m_i_strides[nocontract_idx] * eval_left_dims[i];
}
EIGEN_DIAGNOSTICS(pop)
dim_idx++;
nocontract_idx++;
}
@@ -512,11 +517,14 @@ struct TensorContractionEvaluatorBase {
}
if (!contracting) {
m_dimensions[dim_idx] = eval_right_dims[i];
EIGEN_DIAGNOSTICS(push)
EIGEN_DIAGNOSTICS_OFF(disable : 4789, ignored "-Warray-bounds")
if (nocontract_idx + 1 < internal::array_size<right_nocontract_t>::value) {
m_j_strides[nocontract_idx + 1] = m_j_strides[nocontract_idx] * eval_right_dims[i];
} else {
m_j_size = m_j_strides[nocontract_idx] * eval_right_dims[i];
}
EIGEN_DIAGNOSTICS(pop)
m_right_nocontract_strides[nocontract_idx] = rhs_strides[i];
dim_idx++;
nocontract_idx++;
@@ -537,11 +545,14 @@ struct TensorContractionEvaluatorBase {
Index size = eval_left_dims[left];
eigen_assert(size == eval_right_dims[right] && "Contraction axes must be same size");
EIGEN_DIAGNOSTICS(push)
EIGEN_DIAGNOSTICS_OFF(disable : 4789, ignored "-Warray-bounds")
if (i + 1 < static_cast<int>(internal::array_size<contract_t>::value)) {
m_k_strides[i + 1] = m_k_strides[i] * size;
} else {
m_k_size = m_k_strides[i] * size;
}
EIGEN_DIAGNOSTICS(pop)
m_left_contracting_strides[i] = lhs_strides[left];
m_right_contracting_strides[i] = rhs_strides[right];
@@ -878,18 +889,18 @@ struct TensorContractionEvaluatorBase {
protected:
Dimensions m_dimensions;
contract_t m_k_strides;
contract_t m_left_contracting_strides;
contract_t m_right_contracting_strides;
contract_t m_k_strides{};
contract_t m_left_contracting_strides{};
contract_t m_right_contracting_strides{};
bool m_lhs_inner_dim_contiguous;
bool m_rhs_inner_dim_contiguous;
bool m_rhs_inner_dim_reordered;
left_nocontract_t m_i_strides;
right_nocontract_t m_j_strides;
left_nocontract_t m_left_nocontract_strides;
right_nocontract_t m_right_nocontract_strides;
left_nocontract_t m_i_strides{};
right_nocontract_t m_j_strides{};
left_nocontract_t m_left_nocontract_strides{};
right_nocontract_t m_right_nocontract_strides{};
Index m_i_size;
Index m_j_size;