GCC12 warning: array subscript is partly outside array bounds
If one compiles the following program using Eigen 3.4.0:
#include <Eigen/Dense>
int main(){
Eigen::Array<double, 2, 2> a;
a.setRandom();
Eigen::Array<double, 3, 2> b;
b.col(0).tail(2) = a.col(1);
}
in GCC12 with command-line options: -std=c++20 -Wall -Wextra -pedantic-errors -O2 -march=haswell
then a large error occurs ending with
inlined from 'Packet Eigen::internal::ploadu(const typename unpacket_traits<T>::type*) [with Packet = __vector(4) double]' at /opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/arch/AVX/PacketMath.h:582:129,
inlined from 'Packet Eigen::internal::ploadt(const typename unpacket_traits<T>::type*) [with Packet = __vector(4) double; int Alignment = 0]' at /opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/GenericPacketMath.h:969:26,
inlined from 'PacketType Eigen::internal::mapbase_evaluator<Derived, PlainObjectType>::packet(Eigen::Index) const [with int LoadMode = 0; PacketType = __vector(4) double; Derived = Eigen::Block<Eigen::Array<double, 2, 2>, 2, 1, true>; PlainObjectType = Eigen::Array<double, 2, 1>]' at /opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/CoreEvaluators.h:944:50,
inlined from 'void Eigen::internal::generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor, Version>::assignPacket(Eigen::Index) [with int StoreMode = 32; int LoadMode = 0; PacketType = __vector(4) double; DstEvaluatorTypeT = Eigen::internal::evaluator<Eigen::Block<Eigen::Block<Eigen::Array<double, 3, 2>, 3, 1, true>, -1, 1, false> >; SrcEvaluatorTypeT = Eigen::internal::evaluator<Eigen::Block<Eigen::Array<double, 2, 2>, 2, 1, true> >; Functor = Eigen::internal::assign_op<double, double>; int Version = 0]' at /opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/AssignEvaluator.h:681:114,
inlined from 'static void Eigen::internal::dense_assignment_loop<Kernel, 3, 0>::run(Kernel&) [with Kernel = Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Block<Eigen::Block<Eigen::Array<double, 3, 2>, 3, 1, true>, -1, 1, false> >, Eigen::internal::evaluator<Eigen::Block<Eigen::Array<double, 2, 2>, 2, 1, true> >, Eigen::internal::assign_op<double, double>, 0>]' at /opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/AssignEvaluator.h:437:75,
inlined from 'void Eigen::internal::call_dense_assignment_loop(DstXprType&, const SrcXprType&, const Functor&) [with DstXprType = Eigen::Block<Eigen::Block<Eigen::Array<double, 3, 2>, 3, 1, true>, -1, 1, false>; SrcXprType = Eigen::Block<Eigen::Array<double, 2, 2>, 2, 1, true>; Functor = assign_op<double, double>]' at /opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/AssignEvaluator.h:785:37,
inlined from 'static void Eigen::internal::Assignment<DstXprType, SrcXprType, Functor, Eigen::internal::Dense2Dense, Weak>::run(DstXprType&, const SrcXprType&, const Functor&) [with DstXprType = Eigen::Block<Eigen::Block<Eigen::Array<double, 3, 2>, 3, 1, true>, -1, 1, false>; SrcXprType = Eigen::Block<Eigen::Array<double, 2, 2>, 2, 1, true>; Functor = Eigen::internal::assign_op<double, double>; Weak = void]' at /opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/AssignEvaluator.h:954:31,
inlined from 'void Eigen::internal::call_assignment_no_alias(Dst&, const Src&, const Func&) [with Dst = Eigen::Block<Eigen::Block<Eigen::Array<double, 3, 2>, 3, 1, true>, -1, 1, false>; Src = Eigen::Block<Eigen::Array<double, 2, 2>, 2, 1, true>; Func = assign_op<double, double>]' at /opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/AssignEvaluator.h:890:49,
inlined from 'void Eigen::internal::call_assignment(Dst&, const Src&, const Func&, typename enable_if<(! evaluator_assume_aliasing<Src>::value), void*>::type) [with Dst = Eigen::Block<Eigen::Block<Eigen::Array<double, 3, 2>, 3, 1, true>, -1, 1, false>; Src = Eigen::Block<Eigen::Array<double, 2, 2>, 2, 1, true>; Func = assign_op<double, double>]' at /opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/AssignEvaluator.h:858:27,
inlined from 'void Eigen::internal::call_assignment(Dst&, const Src&) [with Dst = Eigen::Block<Eigen::Block<Eigen::Array<double, 3, 2>, 3, 1, true>, -1, 1, false>; Src = Eigen::Block<Eigen::Array<double, 2, 2>, 2, 1, true>]' at /opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/AssignEvaluator.h:836:18,
inlined from 'Derived& Eigen::DenseBase<Derived>::operator=(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::Block<Eigen::Array<double, 2, 2>, 2, 1, true>; Derived = Eigen::Block<Eigen::Block<Eigen::Array<double, 3, 2>, 3, 1, true>, -1, 1, false>]' at /opt/compiler-explorer/libs/eigen/v3.4.0/Eigen/src/Core/Assign.h:41:28,
inlined from 'int main()' at <source>:7:28:
/opt/compiler-explorer/gcc-12.1.0/lib/gcc/x86_64-linux-gnu/12.1.0/include/avxintrin.h:893:24: warning: array subscript '__m256d_u[0]' is partly outside array bounds of 'Eigen::Array<double, 2, 2> [1]' [-Warray-bounds]
893 | return *(__m256d_u *)__P;
| ^~~
Everything is fine in GCC 11 or other compilers. Online demo: https://gcc.godbolt.org/z/hT348GYo9
Is it Eigen or GCC bug? Related discussion: https://stackoverflow.com/q/72871100/7325599