On 08/01/2025 18:54, Christophe Lyon wrote:
> The previous fix only worked for C, for C++ we need to add more
> information to the underlying type so that
> finish_class_member_access_expr accepts it.
>
> This patch makes gcc.target/arm/mve/intrinsics/pr118332.c pass in C++
> mode.
>
> gcc/ChangeLog:
>
> PR target/118332
> * config/arm/arm-mve-builtins.cc (wrap_type_in_struct): Handle C++
> case.
> ---
> gcc/config/arm/arm-mve-builtins.cc | 16 ++++++++++++++++
> 1 file changed, 16 insertions(+)
>
> diff --git a/gcc/config/arm/arm-mve-builtins.cc
> b/gcc/config/arm/arm-mve-builtins.cc
> index 846cd773c0b..2cf81853cfa 100644
> --- a/gcc/config/arm/arm-mve-builtins.cc
> +++ b/gcc/config/arm/arm-mve-builtins.cc
> @@ -457,6 +457,22 @@ wrap_type_in_struct (tree field_type)
> tree field = build_decl (input_location, FIELD_DECL,
> get_identifier ("val"), field_type);
> tree struct_type = lang_hooks.types.make_type (RECORD_TYPE);
> +
> + /* In C++ we need more info to comply with CLASS_TYPE_P and lookup_member
> in
> + finish_class_member_access_expr. */
> + if (lang_GNU_CXX ())
> + {
> + /* Equivalent to SET_CLASS_TYPE_P (struct_type, 1); but
> SET_CLASS_TYPE_P
> + is not available here. */
> + struct_type->type_common.lang_flag_5 = 1;
> +
> + /* Extracted from xref_basetypes. */
> + tree binfo = make_tree_binfo (0);
> + TYPE_BINFO (struct_type) = binfo;
> + BINFO_OFFSET (binfo) = size_zero_node;
> + BINFO_TYPE (binfo) = struct_type;
> + }
> +
> DECL_FIELD_CONTEXT (field) = struct_type;
> TYPE_FIELDS (struct_type) = field;
> layout_type (struct_type);
Can't this be handled via lang_hooks.types.simulate_record_decl() rather than
having to have lang-specific code directly in the back-end?
R.