diff options
author | qiyao <qiyao> | 2012-11-27 07:59:11 +0000 |
---|---|---|
committer | qiyao <qiyao> | 2012-11-27 07:59:11 +0000 |
commit | bfb1c7c5505a19645d79b974f673e912ddab4ae2 (patch) | |
tree | 26b307275f26c4c47ccea427c1c773ffe0d062a3 /gdb/eval.c | |
parent | 38fba98aebd50b8086dd8ee34f64d03024839747 (diff) | |
download | gdb-bfb1c7c5505a19645d79b974f673e912ddab4ae2.tar.gz |
gdb/
2012-11-27 Daniel Jacobowitz <dan@codesourcery.com>
Yao Qi <yao@codesourcery.com>
* eval.c (evaluate_subexp_standard): Add handling of
TYPE_CODE_MEMBERPTR when calling functions. Correct the
result of ptype for calling a TYPE_CODE_METHODPTR.
gdb/testsuite/
2012-11-27 Daniel Jacobowitz <dan@codesourcery.com>
* gdb.cp/member-ptr.cc (class Diamond): Add func_ptr.
(func): New function.
(main): Initialize diamond.func_ptr and add diamond_pfunc_ptr.
* gdb.cp/member-ptr.exp: Add new tests for ptype and for
pointers to members with pointer-to-function type.
Diffstat (limited to 'gdb/eval.c')
-rw-r--r-- | gdb/eval.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/gdb/eval.c b/gdb/eval.c index f6559577ae1..55582e03292 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -1364,7 +1364,6 @@ evaluate_subexp_standard (struct type *expect_type, alloca (sizeof (struct value *) * (nargs + 3)); if (op == STRUCTOP_MEMBER || op == STRUCTOP_MPTR) { - nargs++; /* First, evaluate the structure into arg2. */ pc2 = (*pos)++; @@ -1388,22 +1387,37 @@ evaluate_subexp_standard (struct type *expect_type, arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); - if (TYPE_CODE (check_typedef (value_type (arg1))) - != TYPE_CODE_METHODPTR) - error (_("Non-pointer-to-member value used in pointer-to-member " - "construct")); + type = check_typedef (value_type (arg1)); + if (TYPE_CODE (type) == TYPE_CODE_METHODPTR) + { + if (noside == EVAL_AVOID_SIDE_EFFECTS) + arg1 = value_zero (TYPE_TARGET_TYPE (type), not_lval); + else + arg1 = cplus_method_ptr_to_value (&arg2, arg1); - if (noside == EVAL_AVOID_SIDE_EFFECTS) + /* Now, say which argument to start evaluating from. */ + nargs++; + tem = 2; + argvec[1] = arg2; + } + else if (TYPE_CODE (type) == TYPE_CODE_MEMBERPTR) { - struct type *method_type = check_typedef (value_type (arg1)); + struct type *type_ptr + = lookup_pointer_type (TYPE_DOMAIN_TYPE (type)); + + /* Now, convert these values to an address. */ + arg2 = value_cast (type_ptr, arg2); - arg1 = value_zero (method_type, not_lval); + mem_offset = value_as_long (arg1); + + arg1 = value_from_pointer (type_ptr, + value_as_long (arg2) + mem_offset); + arg1 = value_ind (arg1); + tem = 1; } else - arg1 = cplus_method_ptr_to_value (&arg2, arg1); - - /* Now, say which argument to start evaluating from. */ - tem = 2; + error (_("Non-pointer-to-member value used in pointer-to-member " + "construct")); } else if (op == STRUCTOP_STRUCT || op == STRUCTOP_PTR) { @@ -1654,7 +1668,7 @@ evaluate_subexp_standard (struct type *expect_type, } else if (op == STRUCTOP_MEMBER || op == STRUCTOP_MPTR) { - argvec[1] = arg2; + /* Pointer to member. argvec[1] is already set up. */ argvec[0] = arg1; } else if (op == OP_VAR_VALUE || (op == OP_SCOPE && function != NULL)) |