https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69078
Bug ID: 69078 Summary: [C++14] function local static not initialized when only used in a generic/variadic lambda Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: mar-bwTmhx at uchuujin dot de Target Milestone: --- The following reduced testcase shows that g++ doesn't initialize the local static "instance". The original testcase is from a embedded arm usecase with gcc 5.1.2 but this testcase is for a standard environment. As i don't have a recent enough gcc for desktop i tested via http://melpon.org/wandbox/permlink/gl8MdzUusCZtO7Ru with gcc version set to 6.0 HEAD compilation: g++ prog.cc -Wall -Wextra -O2 -march=native -std=gnu++1z Of interest might be that g++ also emits a wrong warning: prog.cc: In function 'int main()': prog.cc:20:18: warning: variable 'instance' set but not used [-Wunused-but-set-variable] static Class instance = { probe }; ^~~~~~~~ This program outputs: 0x600ba8 data: (nil) While expected output would with the '(nil)' replaced by a address of the probe function. When enabling the commented use of 'instance' in the normal function body (1) of main the output is an even stranger: 0x600bd8 data: 0x400710 0x600bc8 data: (nil) Only when rewriting the code to use an non generic lambda the bug disappears. (http://melpon.org/wandbox/permlink/MUbb2tHz9EJCOF44) (i.e. funUser([](int p) { user(instance, p); }); #include <stdio.h> struct Class { Class(void (*_param)()) : data(_param) {} void (*data)(); }; void funUser(void (*test)(int)) { test(60); } void user(Class& c, int i) { (void)i; printf("%p data: %p\n", &c, c.data); } void probe() {} int main() { static Class instance = { probe }; //user(instance, 0); // (1) funUser([](auto... p) { user(instance, p...); }); }