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

--- Comment #3 from Tobias Jordan <gcc17 at cwde dot de> ---
Hi,

thanks for taking a look, and thanks for your explanation. As far as I
understand it, it's somewhat intuitive that the qualifiers apply to array
elements and not the array type itself. What bugs me is that -Wcast-qual in
this case looks at the array type, not at the element type, to detect whether
qualifiers match.

My actual use case is more complicated than the first example. I'm doing some
kind of marshalling/unmarshalling:

const int (*bar(const int (*x)[6]))[6]
{
  const void * y = x;           /* (1) */
  /* y takes a journey... */
  return (const int (*)[6]) y;  /* (2) */
}

In this example, if I remove the "const" in (1), I get a warning for
"-Wdiscarded-array-qualifiers". If I make y a "const void *", I get the
"-Wcast-qual" warning in (2). In my opinion, using a "const void *" would be
the correct way to do it.

Actually, when I change the type of y to a "void*" and do an explicit cast in
(1), like in
  void * y = (void *) x;        /* (1') */

I don't get any warning at all. Here, I would expect a "-Wcast-qual" warning:
before the cast, x is a pointer to an array of consts, so I couldn't modify the
pointer target. After the cast, I can, and don't get any warnings (but
undefined behaviour).

So my proposal for -Wcast-qual would be: when looking at pointer-to-array,
consider the qualifiers of the element type, not the array type, to detect
whether qualifiers match.

As a side note, clang seems to agree with me here:

$ clang -Wcast-qual -c foo.c
foo.c:3:24: warning: cast from 'int const (*)[6]' to 'void *' drops const
qualifier [-Wcast-qual]
   void * y = (void *) x;        /* (1') */
                       ^
1 warning generated.

Reply via email to