On Sun, Jul 28, 2024 at 4:16 PM Alejandro Colomar <a...@kernel.org> wrote:
>
> There were two identical definitions, and none of them are available
> where they are needed for implementing _Lengthof().  Merge them, and
> provide the single definition in gcc/tree.{h,cc}, where it's available
> for _Lengthof().
>
> Signed-off-by: Alejandro Colomar <a...@kernel.org>
> ---
>  gcc/cp/cp-tree.h              |  1 -
>  gcc/cp/tree.cc                | 13 -------------
>  gcc/rust/backend/rust-tree.cc | 13 -------------
>  gcc/rust/backend/rust-tree.h  |  2 --
>  gcc/tree.cc                   | 13 +++++++++++++
>  gcc/tree.h                    |  1 +
>  6 files changed, 14 insertions(+), 29 deletions(-)
>
> diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
> index c1a371bc721..e6c1c63f872 100644
> --- a/gcc/cp/cp-tree.h
> +++ b/gcc/cp/cp-tree.h
> @@ -8099,7 +8099,6 @@ extern tree build_exception_variant               
> (tree, tree);
>  extern void fixup_deferred_exception_variants   (tree, tree);
>  extern tree bind_template_template_parm                (tree, tree);
>  extern tree array_type_nelts_total             (tree);
> -extern tree array_type_nelts_top               (tree);
>  extern bool array_of_unknown_bound_p           (const_tree);
>  extern tree break_out_target_exprs             (tree, bool = false);
>  extern tree build_ctor_subob_ref               (tree, tree, tree);
> diff --git a/gcc/cp/tree.cc b/gcc/cp/tree.cc
> index dfd4a3a948b..1f3ecff1a21 100644
> --- a/gcc/cp/tree.cc
> +++ b/gcc/cp/tree.cc
> @@ -3071,19 +3071,6 @@ cxx_print_statistics (void)
>              depth_reached);
>  }
>
> -/* Return, as an INTEGER_CST node, the number of elements for TYPE
> -   (which is an ARRAY_TYPE).  This counts only elements of the top
> -   array.  */
> -
> -tree
> -array_type_nelts_top (tree type)
> -{
> -  return fold_build2_loc (input_location,
> -                     PLUS_EXPR, sizetype,
> -                     array_type_nelts (type),
> -                     size_one_node);
> -}
> -
>  /* Return, as an INTEGER_CST node, the number of elements for TYPE
>     (which is an ARRAY_TYPE).  This one is a recursive count of all
>     ARRAY_TYPEs that are clumped together.  */
> diff --git a/gcc/rust/backend/rust-tree.cc b/gcc/rust/backend/rust-tree.cc
> index 2a5ffcbf895..dd8eda84f9b 100644
> --- a/gcc/rust/backend/rust-tree.cc
> +++ b/gcc/rust/backend/rust-tree.cc
> @@ -859,19 +859,6 @@ is_empty_class (tree type)
>    return CLASSTYPE_EMPTY_P (type);
>  }
>
> -// forked from gcc/cp/tree.cc array_type_nelts_top
> -
> -/* Return, as an INTEGER_CST node, the number of elements for TYPE
> -   (which is an ARRAY_TYPE).  This counts only elements of the top
> -   array.  */
> -
> -tree
> -array_type_nelts_top (tree type)
> -{
> -  return fold_build2_loc (input_location, PLUS_EXPR, sizetype,
> -                         array_type_nelts (type), size_one_node);
> -}
> -
>  // forked from gcc/cp/tree.cc builtin_valid_in_constant_expr_p
>
>  /* Test whether DECL is a builtin that may appear in a
> diff --git a/gcc/rust/backend/rust-tree.h b/gcc/rust/backend/rust-tree.h
> index 26c8b653ac6..e597c3ab81d 100644
> --- a/gcc/rust/backend/rust-tree.h
> +++ b/gcc/rust/backend/rust-tree.h
> @@ -2993,8 +2993,6 @@ extern location_t rs_expr_location (const_tree);
>  extern int
>  is_empty_class (tree type);
>
> -extern tree array_type_nelts_top (tree);
> -
>  extern bool
>  is_really_empty_class (tree, bool);
>
> diff --git a/gcc/tree.cc b/gcc/tree.cc
> index 2d2d5b6db6e..3b0adb4cd9f 100644
> --- a/gcc/tree.cc
> +++ b/gcc/tree.cc
> @@ -3729,6 +3729,19 @@ array_type_nelts (const_tree type)
>           ? max
>           : fold_build2 (MINUS_EXPR, TREE_TYPE (max), max, min));
>  }
> +
> +/* Return, as an INTEGER_CST node, the number of elements for TYPE
> +   (which is an ARRAY_TYPE).  This counts only elements of the top
> +   array.  */
> +
> +tree
> +array_type_nelts_top (tree type)
> +{
> +  return fold_build2_loc (input_location,
> +                     PLUS_EXPR, sizetype,
> +                     array_type_nelts (type),
> +                     size_one_node);
> +}

But this is now extremely confusing API with array_type_nelts above this
saying

/* Return, as a tree node, the number of elements for TYPE (which is an
   ARRAY_TYPE) minus one.  This counts only elements of the top array.  */

so both are "_top".  And there's build_array_type_nelts that's taking
the number of elements.

Can you please rename the existing array_type_nelts to
array_type_nelts_minus_one?  Then _top could be dropped as well from
the alternate API  you add.

I'll also note since array_type_nelts_top calls the other function and that has

  /* If they did it with unspecified bounds, then we should have already
     given an error about it before we got here.  */
  if (! TYPE_DOMAIN (type))
    return error_mark_node;

the function should handle error_mark_node (and pass that down).

Note array_type_nelts returns nelts - 1 because that avoids building
a new tree node for arrays with lower bound zero.

Thanks,
Richard.

>  /* If arg is static -- a reference to an object in static storage -- then
>     return the object.  This is not the same as the C meaning of `static'.
> diff --git a/gcc/tree.h b/gcc/tree.h
> index 28e8e71b036..c620e55b68d 100644
> --- a/gcc/tree.h
> +++ b/gcc/tree.h
> @@ -4922,6 +4922,7 @@ extern tree build_method_type (tree, tree);
>  extern tree build_offset_type (tree, tree);
>  extern tree build_complex_type (tree, bool named = false);
>  extern tree array_type_nelts (const_tree);
> +extern tree array_type_nelts_top (tree);
>
>  extern tree value_member (tree, tree);
>  extern tree purpose_member (const_tree, tree);
> --
> 2.45.2
>

Reply via email to