Support overloading of 'operator->'.

2010-10-19  Sami Wagiaalla  <swagiaal@redhat.com>

	 PR C++/11500:
	* valarith.c (value_x_unop): Handle STRUCTOP_PTR.
	* eval.c (evaluate_subexp_standard): Check for overload of
	'operator->'.
	* valarith.c (value_x_binop): Throw NOT_FOUND_ERROR.
	(value_x_unop): Ditto.
	* valops.c: Include "exceptions.h".
	(find_overload_match): Throw NOT_FOUND_ERROR.
	(value_struct_elt): Ditto.

2010-10-19  Sami Wagiaalla  <swagiaal@redhat.com>

	* gdb.cp/smartp.exp: New test.
	* gdb.cp/smartp.cc : New test.
This commit is contained in:
Sami Wagiaalla 2010-10-19 20:53:15 +00:00
parent cca56ac7ae
commit 79afc5ef5d
5 changed files with 74 additions and 4 deletions

View File

@ -1,3 +1,15 @@
2010-10-19 Sami Wagiaalla <swagiaal@redhat.com>
PR C++/11500:
* valarith.c (value_x_unop): Handle STRUCTOP_PTR.
* eval.c (evaluate_subexp_standard): Check for overload of
'operator->'.
* valarith.c (value_x_binop): Throw NOT_FOUND_ERROR.
(value_x_unop): Ditto.
* valops.c: Include "exceptions.h".
(find_overload_match): Throw NOT_FOUND_ERROR.
(value_struct_elt): Ditto.
2010-10-19 Tom Tromey <tromey@redhat.com>
* python/py-cmd.c (cmdpy_function): Unreference exception state.

View File

@ -1510,6 +1510,28 @@ evaluate_subexp_standard (struct type *expect_type,
else
{
arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
/* Check to see if the operator '->' has been overloaded. If the operator
has been overloaded replace arg2 with the value returned by the custom
operator and continue evaluation. */
while (unop_user_defined_p (op, arg2))
{
volatile struct gdb_exception except;
struct value *value = NULL;
TRY_CATCH (except, RETURN_MASK_ERROR)
{
value = value_x_unop (arg2, op, noside);
}
if (except.reason < 0)
{
if (except.error == NOT_FOUND_ERROR)
break;
else
throw_exception (except);
}
arg2 = value;
}
}
/* Now, say which argument to start evaluating from */
tem = 2;
@ -1898,6 +1920,27 @@ evaluate_subexp_standard (struct type *expect_type,
if (noside == EVAL_SKIP)
goto nosideret;
/* Check to see if operator '->' has been overloaded. If so replace
arg1 with the value returned by evaluating operator->(). */
while (unop_user_defined_p (op, arg1))
{
volatile struct gdb_exception except;
struct value *value = NULL;
TRY_CATCH (except, RETURN_MASK_ERROR)
{
value = value_x_unop (arg1, op, noside);
}
if (except.reason < 0)
{
if (except.error == NOT_FOUND_ERROR)
break;
else
throw_exception (except);
}
arg1 = value;
}
/* JYG: if print object is on we need to replace the base type
with rtti type in order to continue on with successful
lookup of member / method only available in the rtti type. */

View File

@ -1,3 +1,8 @@
2010-10-19 Sami Wagiaalla <swagiaal@redhat.com>
* gdb.cp/smartp.exp: New test.
* gdb.cp/smartp.cc : New test.
2010-10-19 Sami Wagiaalla <swagiaal@redhat.com>
* gdb.cp/converts.exp: Test pointer to bool conversion.

View File

@ -541,7 +541,8 @@ value_x_binop (struct value *arg1, struct value *arg2, enum exp_opcode op,
}
return call_function_by_hand (argvec[0], 2 - static_memfuncp, argvec + 1);
}
error (_("member function %s not found"), tstr);
throw_error (NOT_FOUND_ERROR,
_("member function %s not found"), tstr);
#ifdef lint
return call_function_by_hand (argvec[0], 2 - static_memfuncp, argvec + 1);
#endif
@ -616,6 +617,9 @@ value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside)
case UNOP_IND:
strcpy (ptr, "*");
break;
case STRUCTOP_PTR:
strcpy (ptr, "->");
break;
default:
error (_("Invalid unary operation specified."));
}
@ -641,7 +645,9 @@ value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside)
}
return call_function_by_hand (argvec[0], nargs, argvec + 1);
}
error (_("member function %s not found"), tstr);
throw_error (NOT_FOUND_ERROR,
_("member function %s not found"), tstr);
return 0; /* For lint -- never reached */
}

View File

@ -46,6 +46,7 @@
#include "observer.h"
#include "objfiles.h"
#include "symtab.h"
#include "exceptions.h"
extern int overload_debug;
/* Local functions. */
@ -2215,7 +2216,8 @@ value_struct_elt (struct value **argp, struct value **args,
}
if (!v)
error (_("Structure has no component named %s."), name);
throw_error (NOT_FOUND_ERROR,
_("Structure has no component named %s."), name);
return v;
}
@ -2533,7 +2535,9 @@ find_overload_match (struct type **arg_types, int nargs,
/* Did we find a match ? */
if (method_oload_champ == -1 && func_oload_champ == -1)
error (_("No symbol \"%s\" in current context."), name);
throw_error (NOT_FOUND_ERROR,
_("No symbol \"%s\" in current context."),
name);
/* If we have found both a method match and a function
match, find out which one is better, and calculate match