]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
C: Do not warn for calls to .ACCESS_WITH_SIZE when -Wbad-function-cast is specified...
authorQing Zhao <qing.zhao@oracle.com>
Mon, 26 Jan 2026 20:22:43 +0000 (20:22 +0000)
committerQing Zhao <qing.zhao@oracle.com>
Tue, 27 Jan 2026 20:46:04 +0000 (20:46 +0000)
For the following source code:

(uintptr_t)b->ptr;

when b->ptr has an counted_by annotation, the IR for this pointer reference
is changed to a call to .ACCESS_WITH_SIZE as:

(uintptr_t).ACCESS_WITH_SIZE (b->ptr, &b->len, 0B, 1);

As a result, the following code in the routine "build_c_cast" is invoked:

 7455       if (TREE_CODE (value) == CALL_EXPR
 7456           && TREE_CODE (type) != TREE_CODE (otype))
 7457         warning_at (loc, OPT_Wbad_function_cast,
 7458                     "cast from function call of type %qT "
 7459                     "to non-matching type %qT", otype, type);
 7460

It's obviously that C FE should exclude the call to .ACCESS_WITH_SIZE from
issuing such warning.

PR c/123500

gcc/c/ChangeLog:

* c-typeck.cc (build_c_cast): Exclude call to .ACCESS_WITH_SIZE from
-Wbad-function-cast warnings.

gcc/testsuite/ChangeLog:

* gcc.dg/pointer-counted-by-pr123500.c: New test.

gcc/c/c-typeck.cc
gcc/testsuite/gcc.dg/pointer-counted-by-pr123500.c [new file with mode: 0644]

index 60ed44c2f6729264fc0157f2c6cc23afa9cdb232..098a4b553399d2e20ae8d833b8225e760de77874 100644 (file)
@@ -7455,7 +7455,8 @@ build_c_cast (location_t loc, tree type, tree expr)
        warning_at (loc, OPT_Wpointer_to_int_cast,
                    "cast from pointer to integer of different size");
 
-      if (TREE_CODE (value) == CALL_EXPR
+      if ((TREE_CODE (value) == CALL_EXPR
+          && !is_access_with_size_p (value))
          && TREE_CODE (type) != TREE_CODE (otype))
        warning_at (loc, OPT_Wbad_function_cast,
                    "cast from function call of type %qT "
diff --git a/gcc/testsuite/gcc.dg/pointer-counted-by-pr123500.c b/gcc/testsuite/gcc.dg/pointer-counted-by-pr123500.c
new file mode 100644 (file)
index 0000000..6f57ae5
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR c/123500 */
+/* { dg-do compile } */
+/* { dg-options "-Wbad-function-cast" } */
+
+#include <stdint.h>
+struct buffer {
+  uint8_t * ptr __attribute__((counted_by(len)));
+  int len;
+};
+
+uintptr_t foo(struct buffer * b) {
+  return (uintptr_t)b->ptr;
+}