diff --git a/unsupported/Eigen/src/Tensor/TensorContraction.h b/unsupported/Eigen/src/Tensor/TensorContraction.h index 6768814b7..f6cf8402c 100644 --- a/unsupported/Eigen/src/Tensor/TensorContraction.h +++ b/unsupported/Eigen/src/Tensor/TensorContraction.h @@ -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::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::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(internal::array_size::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;