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

            Bug ID: 67386
           Summary: missing diagnostic on a use of an undeclared function
           Product: gcc
           Version: 5.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

GCC isn't completely consistent in diagnosing references to undeclared
functions.  In the test case below, it issues an error for only the last three
out of the four definitions of foo.  It issues a warning for the first one,
even though it too references an undeclared identifier.

Versions prior to 5.1 diagnosed only the second and fourth forms.

$ (set -x && cat t.c && for i in 1 2 3 4; do ~/bin/gcc-5.1.0/bin/gcc -DFOO=$i
-c t.c; done)
+ cat t.c
#if FOO == 1
void* foo (int i) {
    return i ? foobar (i) : foobar;
}
#elif FOO == 2
void* foo (int i) {
    return i ? 0 : foobar;
}
#elif FOO == 3
void* foo (int i) {
    if (i)
        return foobar (i);
    else
        return foobar;
}
#else
void* foo (int i) {
    if (i)
        return 0;
    else
        return foobar;
}
#endif
+ for i in 1 2 3 4
+ /home/msebor/bin/gcc-5.1.0/bin/gcc -DFOO=1 -c t.c
t.c: In function ‘foo’:
t.c:3:16: warning: implicit declaration of function ‘foobar’
[-Wimplicit-function-declaration]
     return i ? foobar (i) : foobar;
                ^
t.c:3:27: warning: pointer/integer type mismatch in conditional expression
     return i ? foobar (i) : foobar;
                           ^
+ for i in 1 2 3 4
+ /home/msebor/bin/gcc-5.1.0/bin/gcc -DFOO=2 -c t.c
t.c: In function ‘foo’:
t.c:7:20: error: ‘foobar’ undeclared (first use in this function)
     return i ? 0 : foobar;
                    ^
t.c:7:20: note: each undeclared identifier is reported only once for each
function it appears in
+ for i in 1 2 3 4
+ /home/msebor/bin/gcc-5.1.0/bin/gcc -DFOO=3 -c t.c
t.c: In function ‘foo’:
t.c:12:16: warning: implicit declaration of function ‘foobar’
[-Wimplicit-function-declaration]
         return foobar (i);
                ^
t.c:12:16: warning: return makes pointer from integer without a cast
[-Wint-conversion]
t.c:14:16: error: ‘foobar’ undeclared (first use in this function)
         return foobar;
                ^
t.c:14:16: note: each undeclared identifier is reported only once for each
function it appears in
+ for i in 1 2 3 4
+ /home/msebor/bin/gcc-5.1.0/bin/gcc -DFOO=4 -c t.c
t.c: In function ‘foo’:
t.c:21:16: error: ‘foobar’ undeclared (first use in this function)
         return foobar;
                ^
t.c:21:16: note: each undeclared identifier is reported only once for each
function it appears in

Reply via email to