This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c/79959] New: -Wimplicit-fallthrough doesn't recognize some more complex exit cases


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79959

            Bug ID: 79959
           Summary: -Wimplicit-fallthrough doesn't recognize some more
                    complex exit cases
           Product: gcc
           Version: 7.0.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: peter at eisentraut dot org
  Target Milestone: ---

gcc-7 (Homebrew GCC 7-20170305_1) 7.0.1 20170305 (experimental)

Code:

#include <stdlib.h>

int
main(int argc, char **argv)
{
        switch (argc)
        {
        case 1:
                do { if (__builtin_constant_p(20) && (20) >= 20) abort(); }
while(0);
        default:
                return 0;
        }
}

gcc-7 -Wimplicit-fallthrough -O2 -c test.c
test.c: In function 'main':
test.c:9:11: warning: this statement may fall through [-Wimplicit-fallthrough=]
   do { if (__builtin_constant_p(20) && (20) >= 20) abort(); } while(0);

I would expect no warning here.

This concoction is a macro expansion that intends to communicate "noreturn"
based on some constant argument value, and that generally works well for
avoiding uninitialized variable warnings and things like that, so the control
flow analysis is smart enough to recognize that this is an unconditional exit. 
But the fallthrough analysis doesn't appear to be that smart.  It only detects
a plain abort() or something like that.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]