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).
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

Reply via email to