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 >