diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 1326f85..0f5093d 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -568,7 +568,7 @@ address_space_int_to_name (struct gdbarch *gdbarch, int space_flag) If STORAGE is non-NULL, create the new type instance there. STORAGE must be in the same obstack as TYPE. */ -static struct type * +struct type * make_qualified_type (struct type *type, int new_flags, struct type *storage) { diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index bd1a0ab..80ed725 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -1647,6 +1647,9 @@ extern int address_space_name_to_int (struct gdbarch *, char *); extern const char *address_space_int_to_name (struct gdbarch *, int); +extern struct type *make_qualified_type (struct type *type, int new_flags, + struct type *storage); + extern struct type *make_type_with_address_space (struct type *type, int space_identifier); diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c index d5ed355..a79a6a9 100644 --- a/gdb/gnu-v3-abi.c +++ b/gdb/gnu-v3-abi.c @@ -1313,11 +1313,19 @@ gnuv3_pass_by_reference (struct type *type) /* If this method takes two arguments, and the second argument is a reference to this class, then it is a copy constructor. */ - if (TYPE_NFIELDS (fieldtype) == 2 - && TYPE_CODE (TYPE_FIELD_TYPE (fieldtype, 1)) == TYPE_CODE_REF - && check_typedef (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (fieldtype, - 1))) == type) - return 1; + if (TYPE_NFIELDS (fieldtype) == 2) + { + struct type *arg_type = TYPE_FIELD_TYPE (fieldtype, 1); + struct type *arg_target_type; + int flags; + + arg_target_type = check_typedef (TYPE_TARGET_TYPE (arg_type)); + flags = TYPE_INSTANCE_FLAGS (arg_target_type); + + if (TYPE_CODE (arg_type) == TYPE_CODE_REF + && arg_target_type == make_qualified_type (type, flags, NULL)) + return 1; + } } /* Even if all the constructors and destructors were artificial, one