https://gcc.gnu.org/g:078b0a2be260ccb2c118865058e75ae038fc1949
commit r16-7077-g078b0a2be260ccb2c118865058e75ae038fc1949 Author: Qing Zhao <[email protected]> Date: Mon Jan 26 20:22:43 2026 +0000 C: Do not warn for calls to .ACCESS_WITH_SIZE when -Wbad-function-cast is specified [PR123500] 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. Diff: --- gcc/c/c-typeck.cc | 3 ++- gcc/testsuite/gcc.dg/pointer-counted-by-pr123500.c | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index 60ed44c2f672..098a4b553399 100644 --- a/gcc/c/c-typeck.cc +++ b/gcc/c/c-typeck.cc @@ -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 index 000000000000..6f57ae5dd660 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pointer-counted-by-pr123500.c @@ -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; +}
