Sorry for the late reply (just came back from LPC after Cauldron). > On Sep 17, 2024, at 05:13, Jakub Jelinek <ja...@redhat.com> wrote: > > On Sat, Sep 14, 2024 at 08:58:28PM +0200, Jakub Jelinek wrote: >> if (has_counted_by_object (e_p->value)) >> expr.value = get_counted_by_ref (e_p->value); >> else if (in_typeof && TREE_CODE (e_p->value) == COMPONENT_REF) >> { >> tree counted_by_type = NULL_TREE; >> tree arg = (*cexpr_ >> if (build_counted_by_ref (TREE_OPERAND (e_p->value, 0), >> TREE_OPERAND (e_p->value, 1), >> &counted_by_type)) >> expr.value >> = build_zero_cst (build_pointer_type (counted_by_type)); >> else >> expr.value = null_pointer_node; >> } >> else >> expr.value = null_pointer_node; >> >> (plus make build_counted_by_ref non-static and add prototype). >> >> Completely untested. > > Note, the above I think ought to work with say > __typeof (__builtin_counted_by_ref (obj->fam)) > or > __alignof (*__builtin_counted_by_ref (obj->fam)) > but will not work with say > struct with_fam obj; > void foo () { > ... > __typeof (char [__builtin_counted_by_ref (obj.fam) == &obj.size ? 1 : -1]) > ... > } > etc. (and similar for alignof; something like that should go into the > testsuite).
Sure, will add the above into the testsuite. thanks. Qing > So maybe better > tree arg = e_p->value; > tree f; > if ((in_typeof || in_alignof) > && TREE_CODE (arg) == COMPONENT_REF > && (f = TREE_OPERAND (arg, 1)) > && TREE_CODE (f) == FIELD_DECL > && c_flexible_array_member_type_p (TREE_TYPE (f)) > && lookup_attribute ("counted_by", DECL_ATTRIBUTES (f)) > && DECL_NAME (f)) > arg = build_component_ref (EXPR_LOCATION (arg), > TREE_OPERAND (arg, 0), > DECL_NAME (f), UNKNOWN_LOCATION, > UNKNOWN_LOCATION, true); > if (has_counted_by_object (arg)) > expr.value = get_counted_by_ref (arg); > else > expr.value = null_pointer_node; > > Jakub >