From: Qing Zhao Date: Tue, 9 Dec 2025 14:21:55 +0000 (+0000) Subject: c: ICE in gimplify_expr when counted_by for pointer is added [PR122982] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cd4d3a14b231cd5a0e38034e1aa155078944bc8e;p=thirdparty%2Fgcc.git 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 --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index d7c9a324d7a..735cfc61d1e 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 00000000000..1bad7f080e0 --- /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); +}