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 15:35:40 -0400
- Subject: Re: [patch 1/2] Fix overload resolution of int* vs void*
- References: <4C7BCD42.9070308@redhat.com> <m362yrkgzj.fsf@fleche.redhat.com> <4CAF6546.4070603@redhat.com> <m31v80tt0s.fsf@fleche.redhat.com>
Thanks for the prompt review. A revised patch is attached.
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..9c3152d 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -1870,14 +1870,13 @@ class_types_same_p (const struct type *a, const struct type *b)
&& !strcmp (TYPE_NAME (a), TYPE_NAME (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. */
+/* Check whether BASE is an ancestor or base class of DCLASS
+ Return 1 if so, and 0 if not. If PUBLIC is 1 then only public
+ 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,36 +1888,35 @@ is_ancestor (struct type *base, struct type *dclass)
for (i = 0; i < TYPE_N_BASECLASSES (dclass); i++)
{
- if (is_ancestor (base, TYPE_BASECLASS (dclass, i)))
+ if (public && ! BASETYPE_VIA_PUBLIC (dclass, i))
+ continue;
+
+ if (do_is_ancestor (base, TYPE_BASECLASS (dclass, i), public))
return 1;
}
return 0;
}
+/* Check whether BASE is an ancestor or base class or DCLASS
+ Return 1 if so, and 0 if not.
+ Note: If BASE and DCLASS are of the same type, this function
+ will return 1. So for some class A, is_ancestor (A, A) will
+ return 1. */
+
+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. */