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
};