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.

Reply via email to