+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.
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;
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. */
+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.
}
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
case UNOP_IND:
strcpy (ptr, "*");
break;
+ case STRUCTOP_PTR:
+ strcpy (ptr, "->");
+ break;
default:
error (_("Invalid unary operation specified."));
}
}
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 */
}
\f
#include "observer.h"
#include "objfiles.h"
#include "symtab.h"
+#include "exceptions.h"
extern int overload_debug;
/* Local functions. */
}
if (!v)
- error (_("Structure has no component named %s."), name);
+ throw_error (NOT_FOUND_ERROR,
+ _("Structure has no component named %s."), name);
return v;
}
/* 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