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

            Bug ID: 60741
           Summary: [-Wmaybe-uninitialized] false negative and confusing
                    warning message
           Product: gcc
           Version: 4.8.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: skvadrik at gmail dot com

Created attachment 32521
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=32521&action=edit
wmaybe_uninitialized_strange_behavior.c

Given this code:

    enum A { A1, A2 };
    enum B { B1 };
    static inline int fa (enum A a) {
        int n;
        switch (a) {
            case A1: n = 1; break;
            case A2: n = 2; break;
        }
        return n;
    }
    static inline int fb (enum B b) {
        int n;
        switch (b) {
            case B1: n = 1; break;
        }
        return n;
    }
    int main (int argc, char **) {
        return fa((A)argc) + fb((B)argc);
    }

$ g++ -O1 -Wall wmaybe_uninitialized_strange_behavior.c
wmaybe_uninitialized_strange_behavior.c: In function ‘int main(int, char**)’:
wmaybe_uninitialized_strange_behavior.c:27:36: warning: ‘n’ may be used
uninitialized in this function [-Wmaybe-uninitialized]
     return fa((A)argc) + fb((B)argc);
                                    ^

1) gcc generates warning for 'fa' function, but not for 'fb' function.
2) The message points to the end of expression, that contains 'fa' call (not to
'fa' declaration, or at least to 'fa' call). The message mentions name of a
variable, that is used in 'fa' declaration. So we're lucky that the same name
doesn't appear in the calling function (main).
3) This all happens with -O1 or higher, with -O0 there's no warnings at all!

Reply via email to