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.