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

            Bug ID: 81233
           Summary: --Wdiscarded-qualifiers and
                    Wincompatible-pointer-types missing important detail
           Product: gcc
           Version: 7.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: ---

The -Wdiscarded-qualifiers and -Wincompatible-pointer-types warnings (and
possibly others like these two) point out incompatibilities in expressions
involving conversions between incompatible pointer types but neglect to mention
the actual types of the pointer operands or where they are declared.  For
example, imagine that in the program below the struct is defined in some header
file far removed from the assignment that triggers the warning.  The lack of
detail makes it difficult to tell what the expected types are and what the
appropriate fix is.

$ cat x.c && gcc -S -Wall -xc x.c
struct S { int *p; char *q; const char *r; };

void f (struct S *s)
{
  s->p = s->q;
  s->q = s->r;
}
x.c: In function ‘f’:
x.c:5:8: warning: assignment from incompatible pointer type
[-Wincompatible-pointer-types]
   s->p = s->q;
        ^
x.c:6:8: warning: assignment discards ‘const’ qualifier from pointer target
type [-Wdiscarded-qualifiers]
   s->q = s->r;
        ^

In contrast to GCC, Clang issues the following messages:

t.c:5:8: warning: incompatible pointer types assigning to 'int *' from 'char *'
      [-Wincompatible-pointer-types]
  s->p = s->q;
       ^ ~~~~
t.c:6:8: warning: assigning to 'char *' from 'const char *' discards qualifiers
      [-Wincompatible-pointer-types-discards-qualifiers]
  s->q = s->r;
       ^ ~~~~

Reply via email to