Hi, 1. For the following source code (portion):
struct annotated { size_t foo; char b; char array[] __attribute__((counted_by (foo))); }; static void noinline bar () { struct annotated *p2 = alloc_buf (10); p2->array[8] = 0; return; } 2. I modified C FE to generate the following code for the routine “bar”: ;; Function bar (null) ;; enabled by -tree-original { struct annotated * p2 = alloc_buf (10); struct annotated * p2 = alloc_buf (10); .ACCESS_WITH_SIZE ((char *) &p2->array, &p2->foo, 1, 8, -1)[8] = 0; return; } The gimpliflication asserted at:/home/opc/Install/latest-d/bin/gcc -O2 -fdump-tree-all ttt_1.c ttt_1.c: In function ‘bar’: ttt_1.c:29:5: internal compiler error: in create_tmp_var, at gimple-expr.cc:488 29 | p2->array[8] = 0; | ~~^~~~~~~ 3. The reason for this assertion failure is: (in gcc/gimplify.cc) 16686 case CALL_EXPR: 16687 ret = gimplify_call_expr (expr_p, pre_p, fallback != fb_none); 16688 16689 /* C99 code may assign to an array in a structure returned 16690 from a function, and this has undefined behavior only on 16691 execution, so create a temporary if an lvalue is 16692 required. */ 16693 if (fallback == fb_lvalue) 16694 { 16695 *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p, false); 16696 mark_addressable (*expr_p); 16697 ret = GS_OK; 16698 } 16699 break; At Line 16695, when gimplifier tried to create a temporary value for the .ACCESS_WITH_SIZE function as: tmp = .ACCESS_WITH_SIZE ((char *) &p2->array, &p2->foo, 1, 8, -1); It asserted since the TYPE of the function .ACCESS_WITH_SIZE is an INCOMPLETE_TYPE (it’s the TYPE of p2->array, which is an incomplete type). 4. I am stuck on how to resolve this issue properly: The first question is: Where should we generate tmp = .ACCESS_WITH_SIZE ((char *) &p2->array, &p2->foo, 1, 8, -1) In C FE or in middle-end gimplification? Thanks a lot for your help. Qing