https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90740
Bug ID: 90740 Summary: regression - Incorrect warning (is used uninitialized in this function) Product: gcc Version: 9.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: v at vsamko dot com Target Milestone: --- We are not "using" `buf` there. We are passing it by reference, which is a valid code and it shouldn't raise any warnings (for example, it can be a buffer pointer that we pass as a destination to memcpy, and it does not need to be initialised). If we replace "int SIZE = 100" with "constexpr int SIZE = 100" then the warning goes away, which doesn't make any sense. g++ 7 and 8 don't show this warning on this code. Also, why does the warning refers to the variable as "<anonymous>" when it clearly has a name? ========= template<typename T, typename... U> void bar(T t, U... u) { t(u...); } template<typename T> void doit(T) {} int SIZE = 100; template<typename ...Vs> void read(Vs & ...out) { char buf[SIZE]; bar([&buf, &out...](auto&... column) { (doit(column), ...); }, out...); } int main() { int x1; read(x1); } ========= source>: In lambda function: <source>:14:9: warning: '<anonymous>' is used uninitialized in this function [-Wuninitialized] 14 | bar([&buf, &out...](auto&... column) { (doit(column), ...); }, out...); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <source>:13:10: note: '<anonymous>' was declared here 13 | char buf[SIZE]; | ^~~ Compiler returned: 0