This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [patch 1/2] Fix overload resolution of int* vs void*
- From: sami wagiaalla <swagiaal at redhat dot com>
- To: Tom Tromey <tromey at redhat dot com>
- Cc: gdb-patches at sourceware dot org
- Date: Fri, 08 Oct 2010 14:39:02 -0400
- Subject: Re: [patch 1/2] Fix overload resolution of int* vs void*
- References: <4C7BCD42.9070308@redhat.com> <m362yrkgzj.fsf@fleche.redhat.com>
is_ancestor and is_public_ancestor have a lot of redundant code. This
patch shares the code between that two. This way improvements the the
function can be shared between the two functions. I don't like the name
do_is_ancestor but I could not come up with anything better
Eliminate 'is_ancestor' redundant code.
2010-10-08 Sami Wagiaalla <swagiaal@redhat.com>
* gdbtypes.c (do_is_ancestor): New function.
(is_ancestor): Use do_is_ancestor.
(is_public_ancestor): Use do_is_ancestor.
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index c35adbb..e2a8a62 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -1871,13 +1871,12 @@ class_types_same_p (const struct type *a, const struct type *b)
}
/* Check whether BASE is an ancestor or base class or DCLASS
- Return 1 if so, and 0 if not.
- Note: callers may want to check for identity of the types before
- calling this function -- identical types are considered to satisfy
- the ancestor relationship even if they're identical. */
+ Return 1 if so, and 0 if not. If PUBLIC is 1 then only public
+ ancestors ancestors are considered, and the function returns 1 only
+ if BASE is a public ancestor of DCLASS. */
-int
-is_ancestor (struct type *base, struct type *dclass)
+static int
+do_is_ancestor (struct type *base, struct type *dclass, int public)
{
int i;
@@ -1889,6 +1888,9 @@ is_ancestor (struct type *base, struct type *dclass)
for (i = 0; i < TYPE_N_BASECLASSES (dclass); i++)
{
+ if (public && ! BASETYPE_VIA_PUBLIC (dclass, i))
+ continue;
+
if (is_ancestor (base, TYPE_BASECLASS (dclass, i)))
return 1;
}
@@ -1896,29 +1898,25 @@ is_ancestor (struct type *base, struct type *dclass)
return 0;
}
+/* Check whether BASE is an ancestor or base class or DCLASS
+ Return 1 if so, and 0 if not.
+ Note: callers may want to check for identity of the types before
+ calling this function -- identical types are considered to satisfy
+ the ancestor relationship even if they're identical. */
+
+int
+is_ancestor (struct type *base, struct type *dclass)
+{
+ return do_is_ancestor (base, dclass, 0);
+}
+
/* Like is_ancestor, but only returns true when BASE is a public
ancestor of DCLASS. */
int
is_public_ancestor (struct type *base, struct type *dclass)
{
- int i;
-
- CHECK_TYPEDEF (base);
- CHECK_TYPEDEF (dclass);
-
- if (class_types_same_p (base, dclass))
- return 1;
-
- for (i = 0; i < TYPE_N_BASECLASSES (dclass); ++i)
- {
- if (! BASETYPE_VIA_PUBLIC (dclass, i))
- continue;
- if (is_public_ancestor (base, TYPE_BASECLASS (dclass, i)))
- return 1;
- }
-
- return 0;
+ return do_is_ancestor (base, dclass, 1);
}
/* A helper function for is_unique_ancestor. */