This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH/c++: Fix overloaded operator calling


Three things were broken:
 - We did not differentiate pre- and post- increment.
 - We did not actually differentiate increment and decrement (!).
 - Passing references to functions appears to have been broken.

Peter Schauer kindly pointed out the third of these.  He also pointed
out the tests which are supposed to test this sort of thing; see my next
message.

I've committed these.

-- 
Daniel Jacobowitz                           Carnegie Mellon University
MontaVista Software                         Debian GNU/Linux Developer

2002-02-16  Daniel Jacobowitz  <drow@mvista.com>

	* valarith.c (value_x_unop): Fix decrement; support post-decrement.

2002-02-16  Daniel Jacobowitz  <drow@mvista.com>

	From Peter Schauer <Peter.Schauer@Regent.E-Technik.TU-Muenchen.DE>:
	* valops.c (value_arg_coerce): Don't take the address of a reference
	to convert an argument to a reference.

Index: valarith.c
===================================================================
RCS file: /cvs/src/src/gdb/valarith.c,v
retrieving revision 1.12
diff -u -p -r1.12 valarith.c
--- valarith.c	2002/01/04 05:20:08	1.12
+++ valarith.c	2002/02/16 22:19:51
@@ -464,7 +464,7 @@ value_x_unop (struct value *arg1, enum e
   struct value **argvec;
   char *ptr, *mangle_ptr;
   char tstr[13], mangle_tstr[13];
-  int static_memfuncp;
+  int static_memfuncp, nargs;
 
   COERCE_REF (arg1);
   COERCE_ENUM (arg1);
@@ -475,10 +475,12 @@ value_x_unop (struct value *arg1, enum e
   if (TYPE_CODE (check_typedef (VALUE_TYPE (arg1))) != TYPE_CODE_STRUCT)
     error ("Can't do that unary op on that type");	/* FIXME be explicit */
 
-  argvec = (struct value **) alloca (sizeof (struct value *) * 3);
+  argvec = (struct value **) alloca (sizeof (struct value *) * 4);
   argvec[1] = value_addr (arg1);
   argvec[2] = 0;
 
+  nargs = 1;
+
   /* make the right function name up */
   strcpy (tstr, "operator__");
   ptr = tstr + 8;
@@ -490,13 +492,19 @@ value_x_unop (struct value *arg1, enum e
       strcpy (ptr, "++");
       break;
     case UNOP_PREDECREMENT:
-      strcpy (ptr, "++");
+      strcpy (ptr, "--");
       break;
     case UNOP_POSTINCREMENT:
       strcpy (ptr, "++");
+      argvec[2] = value_from_longest (builtin_type_int, 0);
+      argvec[3] = 0;
+      nargs ++;
       break;
     case UNOP_POSTDECREMENT:
-      strcpy (ptr, "++");
+      strcpy (ptr, "--");
+      argvec[2] = value_from_longest (builtin_type_int, 0);
+      argvec[3] = 0;
+      nargs ++;
       break;
     case UNOP_LOGICAL_NOT:
       strcpy (ptr, "!");
@@ -521,6 +529,7 @@ value_x_unop (struct value *arg1, enum e
       if (static_memfuncp)
 	{
 	  argvec[1] = argvec[0];
+	  nargs --;
 	  argvec++;
 	}
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
@@ -530,7 +539,7 @@ value_x_unop (struct value *arg1, enum e
 	    = TYPE_TARGET_TYPE (check_typedef (VALUE_TYPE (argvec[0])));
 	  return value_zero (return_type, VALUE_LVAL (arg1));
 	}
-      return call_function_by_hand (argvec[0], 1 - static_memfuncp, argvec + 1);
+      return call_function_by_hand (argvec[0], nargs, argvec + 1);
     }
   error ("member function %s not found", tstr);
   return 0;			/* For lint -- never reached */
Index: valops.c
===================================================================
RCS file: /cvs/src/src/gdb/valops.c,v
retrieving revision 1.51
diff -u -p -r1.51 valops.c
--- valops.c	2002/02/10 05:50:34	1.51
+++ valops.c	2002/02/16 22:19:52
@@ -1149,7 +1149,8 @@ value_arg_coerce (struct value *arg, str
   switch (TYPE_CODE (type))
     {
     case TYPE_CODE_REF:
-      if (TYPE_CODE (arg_type) != TYPE_CODE_REF)
+      if (TYPE_CODE (arg_type) != TYPE_CODE_REF
+	  && TYPE_CODE (arg_type) != TYPE_CODE_PTR)
 	{
 	  arg = value_addr (arg);
 	  VALUE_TYPE (arg) = param_type;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]