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

            Bug ID: 117945
           Summary: -Wuseless-cast could be suppressed when casting
                    to/from a type expanded from typedef or macro
           Product: gcc
           Version: 14.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: k.ponikwicki17 at gmail dot com
  Target Milestone: ---

This is not strictly a bug, more of a suggestion (debatable).

In case of typedef, -Wuseless-cast checks the underlying type,
and because often multiple typedef's share the same type under the hood,
said flag issues the warnings about them which are false-positive in most
cases.

For example, casting from uint64_t to size_t
will trigger the warning on most 64bit machines but not on 32bit
https://godbolt.org/z/j7ooEG5qd

$ cat main.c && gcc main.c -Wuseless-cast && uname -om
#include <stdlib.h>  // size_t
#include <stdint.h>  // uint64_t
int main()
{
    uint64_t a;
    size_t b = (size_t)a;
}
main.c: In function ‘main’:
main.c:6:16: warning: useless cast to type ‘long unsigned int’ [-Wuseless-cast]
    6 |     size_t b = (size_t)a;
      |                ^
x86_64 GNU/Linux

Generally, this warning will be almost always unwanted
while casting between types declared in System Headers
(unless doing something like size_t to/from size_t cast).

I would suggest suppressing the warning in said cases
or allow for alternative warning flag (or additional option for existing flag). 

Potentially related to:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85043
(^ this bug describe alternative -Wcast-to-the-same-type warning)

Tested on: gcc 14.2.1 Linux
  • [Bug c/117945] New: -Wuseless... k.ponikwicki17 at gmail dot com via Gcc-bugs

Reply via email to