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

Reply via email to