https://gcc.gnu.org/g:cd4d3a14b231cd5a0e38034e1aa155078944bc8e
commit r16-5999-gcd4d3a14b231cd5a0e38034e1aa155078944bc8e Author: Qing Zhao <[email protected]> Date: Tue Dec 9 14:21:55 2025 +0000 c: ICE in gimplify_expr when counted_by for pointer is added [PR122982] The first argument of the call to .ACCESS_WITH_SIZE includes "c_maybe_const_expr" which should not be passed to gimplifier. Before passing the expression as the first argument to the call to .ACCESS_WITH_SIZE, c_fully_fold should be called on this expression. PR c/122982 gcc/c/ChangeLog: * c-typeck.cc (build_access_with_size_for_counted_by): Call c_fully_fold on the first parameter. gcc/testsuite/ChangeLog: * gcc.dg/pointer-counted-by-pr122982.c: New test. Diff: --- gcc/c/c-typeck.cc | 2 +- gcc/testsuite/gcc.dg/pointer-counted-by-pr122982.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index d7c9a324d7ae..735cfc61d1e0 100644 --- a/gcc/c/c-typeck.cc +++ b/gcc/c/c-typeck.cc @@ -3187,7 +3187,7 @@ build_access_with_size_for_counted_by (location_t loc, tree ref, tree first_param = is_fam ? c_fully_fold (array_to_pointer_conversion (loc, ref), false, NULL) - : ref; + : c_fully_fold (ref, false, NULL); tree second_param = c_fully_fold (counted_by_ref, false, NULL); tree third_param = build_int_cst (c_build_pointer_type (counted_by_type), 0); diff --git a/gcc/testsuite/gcc.dg/pointer-counted-by-pr122982.c b/gcc/testsuite/gcc.dg/pointer-counted-by-pr122982.c new file mode 100644 index 000000000000..1bad7f080e03 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pointer-counted-by-pr122982.c @@ -0,0 +1,19 @@ +/* PR c/122982 */ +/* { dg-do compile } */ +/* { dg-options "-O0" } */ + +int* f (int); + +struct __bounded_ptr { + int k; + int *buf __attribute__ ((counted_by (k))); +}; + +int* +f1 (int n) { return f (n); } + +void h1 (void) +{ + int *p = (struct __bounded_ptr) {3, f1 (3)}.buf; + __builtin_memset (p, 0, 3 * sizeof p); +}
