diff options
author | Yao Qi <yao@codesourcery.com> | 2012-11-27 07:59:12 +0000 |
---|---|---|
committer | Yao Qi <yao@codesourcery.com> | 2012-11-27 07:59:12 +0000 |
commit | 5edf51feeade2be8b6ab6d49507a6023a6d9a176 (patch) | |
tree | 77f3999c0747055349be11ed3119d56037e78a7a /gdb/eval.c | |
parent | ca242aadec5ec762ae852ae80b67772302c534b8 (diff) | |
download | gdb-5edf51feeade2be8b6ab6d49507a6023a6d9a176.zip gdb-5edf51feeade2be8b6ab6d49507a6023a6d9a176.tar.gz gdb-5edf51feeade2be8b6ab6d49507a6023a6d9a176.tar.bz2 |
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
@@ -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)) |