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);
-- 
2.34.1

Reply via email to