https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113987
Bug ID: 113987 Summary: Binding a reference to an uninitialized data member should not cause -Wuninitialized Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: i at maskray dot me Target Milestone: --- https://godbolt.org/z/G7ndsTv5c (from https://github.com/llvm/llvm-project/pull/81179#issuecomment-1937082113) struct t1 { t1(int); }; struct t2 { t2(int&, int = 0); }; struct t3 { t3(int&); }; struct t4 {}; void f1(int&); struct t { t() : v1(i), v2(i), v3(i), v4((f1(i), t4())), v5(i) {} t1 v1; t2 v2; t3 v3; t4 v4; t1 v5; int i; int j; }; int main() { t v1; } GCC output ``` <source>: In constructor 't::t()': <source>:13:14: warning: member 't::i' is used uninitialized [-Wuninitialized] 13 | t() : v1(i), v2(i), v3(i), v4((f1(i), t4())), v5(i) {} | ^ <source>:13:21: warning: member 't::i' is used uninitialized [-Wuninitialized] 13 | t() : v1(i), v2(i), v3(i), v4((f1(i), t4())), v5(i) {} | ^ <source>:13:28: warning: member 't::i' is used uninitialized [-Wuninitialized] 13 | t() : v1(i), v2(i), v3(i), v4((f1(i), t4())), v5(i) {} | ^ <source>: In constructor 't::t()': <source>:13:11: warning: '*this.t::i' is used uninitialized [-Wuninitialized] 13 | t() : v1(i), v2(i), v3(i), v4((f1(i), t4())), v5(i) {} | ^~~~~ ``` Clang output ``` <source>:13:14: warning: field 'i' is uninitialized when used here [-Wuninitialized] 13 | t() : v1(i), v2(i), v3(i), v4((f1(i), t4())), v5(i) {} | ^ <source>:13:54: warning: field 'i' is uninitialized when used here [-Wuninitialized] 13 | t() : v1(i), v2(i), v3(i), v4((f1(i), t4())), v5(i) {} | ^ 2 warnings generated. ``` Clang suppresses diagnostics when binding a reference (t2, t3) to an uninitialized data member. Smaller example: struct D { int a; int &b; int &c = a; D() : b(a) {} // no warning ?! D(int x) : b(a), a(x) {} // warning };