diff options
author | Siva Chandra <sivachandra@chromium.org> | 2014-09-09 06:03:42 -0700 |
---|---|---|
committer | Siva Chandra <sivachandra@chromium.org> | 2014-10-15 04:25:32 -0700 |
commit | 82c48ac732edb0155288a93ef3dd39625ff2d2e1 (patch) | |
tree | aaa8e3ea7ea59d494f28b9a18ca61a1e0a0b20da /gdb/gnu-v3-abi.c | |
parent | 778811d5e7eb96b5ecb848033ffaa2df455a921e (diff) | |
download | binutils-gdb-82c48ac732edb0155288a93ef3dd39625ff2d2e1.tar.gz |
Fix gnuv3_pass_by_reference to lookup copy c-tors with qualified args.
Before this, a copy constructor declared as in the following snippet was
not being treated as a copy constructor.
class A
{
public:
A (A &); // OK.
A (const A &); // Not being treated as a copy constructor because of the
// 'const' qualifier.
};
gdb/ChangeLog:
PR c++/13403
PR c++/15154
* gnu-v3-abi.c (gnuv3_pass_by_reference): Lookup copy constructors
with qualified args.
Diffstat (limited to 'gdb/gnu-v3-abi.c')
-rw-r--r-- | gdb/gnu-v3-abi.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c index d02c8bc1c7c..558ec06ccfa 100644 --- a/gdb/gnu-v3-abi.c +++ b/gdb/gnu-v3-abi.c @@ -1312,11 +1312,17 @@ 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; + + arg_target_type = check_typedef (TYPE_TARGET_TYPE (arg_type)); + + if (TYPE_CODE (arg_type) == TYPE_CODE_REF + && class_types_same_p (arg_target_type, type)) + return 1; + } } /* Even if all the constructors and destructors were artificial, one |