[PATCH] Make -Wuninitialized warn on pointer-to-member and comma operators.

Arthur O'Dwyer arthur.j.odwyer at gmail.com
Sat Dec 14 11:00:43 PST 2013


On Fri, Dec 13, 2013 at 10:08 AM, Enrico Pertoso <epertoso at google.com> wrote:
> http://llvm-reviews.chandlerc.com/D2387
[...]
> +void test_comma () {
> +  int a;  // expected-note {{initialize the variable 'a' to silence this warning}}
> +  int b = (a, a ?: 2);  // expected-warning {{variable 'a' is uninitialized when used here}}
> +  int c = (a, a, b, c);  // expected-warning {{variable 'c' is uninitialized when used within its own initialization}}
> +  int d;  // expected-note {{initialize the variable 'd' to silence this warning}}
> +  int e = (foo(d), e, b); // expected-warning {{variable 'd' is uninitialized when used here}}
> +}

Incidentally, I don't see any test for the simple case of

    int g;
    int h = (g, 42);

where the uninitialized variable's first use is on the *left-hand*
side of a comma operator. (And where the uninitialized variable
doesn't have another unrelated use elsewhere on the same line, of
course.)  Nor

    int j, j2;
    int k = (j ?: 42);
    int k2 = (0 ?: j);

where the uninitialized variable's first use is on the LHS or RHS of a
?: operator.
Does this patch propose to warn in those cases (IMHO it should)? Is
there already a working test for those cases somewhere?

> +namespace mem_ptr {
> +struct A {
> +  int x;
> +  int y;
> +};
> +
> +void foo() {
> +  int A::* px = &A::x;
> +  A a{ 1, a.*px }; // expected-warning {{variable 'a' is uninitialized when used within its own initialization}}

Notice that the same initializer should *not* warn if struct A is
defined as { int x; int& y; } (i.e., with member 'y' as a reference).
http://llvm.org/bugs/show_bug.cgi?id=14921 is vaguely related.

my $.02,
–Arthur




More information about the cfe-commits mailing list