https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107290
Bug ID: 107290 Summary: False positive -Wuninitialized with Eigen Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: carlosgalvezp at gmail dot com Target Milestone: --- Created attachment 53713 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53713&action=edit Preprocessed source Hi, I'm getting a false positive in the following code (preprocessed attached): #include <Eigen/Core> using Points = Eigen::Array<float, 3, 1>; struct Foo { explicit Foo(Points p); Points p_{}; }; void foo() { Points p{}; Foo Foo(p); } Compiling with flags: -std=c++14 -Wall -Wextra -O3 In file included from /opt/compiler-explorer/libs/eigen/v3.3.7/Eigen/Core:450, from <source>:1: In copy constructor 'Eigen::DenseStorage<T, Size, _Rows, _Cols, _Options>::DenseStorage(const Eigen::DenseStorage<T, Size, _Rows, _Cols, _Options>&) [with T = float; int Size = 3; int _Rows = 3; int _Cols = 1; int _Options = 0]', inlined from 'Eigen::PlainObjectBase<Derived>::PlainObjectBase(const Eigen::PlainObjectBase<Derived>&) [with Derived = Eigen::Array<float, 3, 1>]' at /opt/compiler-explorer/libs/eigen/v3.3.7/Eigen/src/Core/PlainObjectBase.h:520:17, inlined from 'Eigen::Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::Array(const Eigen::Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>&) [with _Scalar = float; int _Rows = 3; int _Cols = 1; int _Options = 0; int _MaxRows = 3; int _MaxCols = 1]' at /opt/compiler-explorer/libs/eigen/v3.3.7/Eigen/src/Core/Array.h:229:25, inlined from 'void foo()' at <source>:14:14: /opt/compiler-explorer/libs/eigen/v3.3.7/Eigen/src/Core/DenseStorage.h:194:47: warning: 'p.Eigen::Array<float, 3, 1, 0, 3, 1>::<unnamed>.Eigen::PlainObjectBase<Eigen::Array<float, 3, 1, 0, 3, 1> >::m_storage.Eigen::DenseStorage<float, 3, 3, 1, 0>::m_data' is used uninitialized [-Wuninitialized] 194 | DenseStorage(const DenseStorage& other) : m_data(other.m_data) { | ^~~~~~~~~~~~~~~~~~~~ <source>: In function 'void foo()': <source>:13:12: note: 'p' declared here 13 | Points p{}; | ^ Repro on Godbolt: https://godbolt.org/z/TaTdT33vr Interestingly, if I define the constructor inline, then the warning disappears: - explicit Foo(Points p); + explicit Foo(Points p) : p_(std::move(p)) {}