http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58455

--- Comment #2 from Roland Dreier <rbd at debian dot org> ---
Arg, I don't seem to be able to avoid breaking my test cases while minimizing
them.  So for my first test case here the issue seems to be that -Og is the
only level that *correctly* warns, which is surprising and I guess is a bug in
it's own right!

Sorry for the confusion.

However the test case I was originally working with and then broke is the
following:

$ cat y.cpp
struct B
{
    int offset;
    bool is_loaded(unsigned char *p1)
    {
        if (offset) {
            *p1 = offset;
            return true;
        }
        return false;
    }
};

unsigned char match(struct B ref)
{
        do {
                unsigned char ref_offset;
                if (!ref.is_loaded(&ref_offset) || false)
                        continue;
                return ref_offset;
        } while (false);

        return 0;
}


$ for o in Og O0 O1 O2 O3; do echo == $o ==;  gcc -Wall -$o -Werror -c ~/y.cpp;
done
== Og ==
/home/roland/y.cpp: In function ‘unsigned char match(B)’:
/home/roland/y.cpp:17:31: error: ‘ref_offset’ may be used uninitialized in this
function [-Werror=maybe-uninitialized]
                 unsigned char ref_offset;
                               ^
cc1plus: all warnings being treated as errors
== O0 ==
== O1 ==
== O2 ==
== O3 ==


in that case is_loaded returns true when it sets the pointer; if it returns
false we continue, fall out of the loop and don't touch the pointer value.  So
I'm pretty sure this case is correctly classified as spurious.

Reply via email to