[RFA] "Sort" C++ fieldlists

Daniel Jacobowitz drow@false.org
Fri Dec 4 20:54:00 GMT 2009


On Fri, Dec 04, 2009 at 09:31:49AM -0800, Keith Seitz wrote:
> Yes, actually it *is* that simple. Or at least none of my testing can
> prove that your (much) simpler patch is any less effective than my
> more complicated one.

I've tested and committed this, then.

-- 
Daniel Jacobowitz
CodeSourcery

2009-12-04  Daniel Jacobowitz  <dan@codesourcery.com>

	* valops.c (value_struct_elt_for_reference): Do not rely on
	field order.

Index: valops.c
===================================================================
RCS file: /cvs/src/src/gdb/valops.c,v
retrieving revision 1.228
diff -u -p -r1.228 valops.c
--- valops.c	2 Dec 2009 19:29:42 -0000	1.228
+++ valops.c	4 Dec 2009 20:25:44 -0000
@@ -2700,29 +2700,31 @@ value_struct_elt_for_reference (struct t
 		}
 
 	      if (j == len)
-		error (_("no member function matches that type instantiation"));	    }
+		error (_("no member function matches that type instantiation"));
+	    }
 	  else
 	    {
 	      int ii;
-	      /* Skip artificial methods.  This is necessary if, for example,
-		 the user wants to "print subclass::subclass" with only
-		 one user-defined constructor.  There is no ambiguity in this
-		 case.  */
+
+	      j = -1;
 	      for (ii = 0; ii < TYPE_FN_FIELDLIST_LENGTH (t, i);
 		   ++ii)
 		{
+		  /* Skip artificial methods.  This is necessary if,
+		     for example, the user wants to "print
+		     subclass::subclass" with only one user-defined
+		     constructor.  There is no ambiguity in this
+		     case.  */
 		  if (TYPE_FN_FIELD_ARTIFICIAL (f, ii))
-		    --len;
-		}
+		    continue;
 
-	      /* Desired method is ambiguous if more than one method is
-		 defined.  */
-	      if (len > 1)
-		error (_("non-unique member `%s' requires type instantiation"), name);
-
-	      /* This assumes, of course, that all artificial methods appear
-		 BEFORE any concrete methods.  */
-	      j = TYPE_FN_FIELDLIST_LENGTH (t, i) - 1;
+		  /* Desired method is ambiguous if more than one
+		     method is defined.  */
+		  if (j != -1)
+		    error (_("non-unique member `%s' requires type instantiation"), name);
+
+		  j = ii;
+		}
 	    }
 
 	  if (TYPE_FN_FIELD_STATIC_P (f, j))



More information about the Gdb-patches mailing list