From: Mark Mitchell Date: Tue, 27 Apr 1999 00:02:52 +0000 (+0000) Subject: search.c (is_subobject_of_p): Make sure we're looking at the right baseclasses. X-Git-Tag: prereleases/gcc-2.95-test~730 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=86eab6f69a953c249635a33d0b07fb46670a7962;p=thirdparty%2Fgcc.git search.c (is_subobject_of_p): Make sure we're looking at the right baseclasses. * search.c (is_subobject_of_p): Make sure we're looking at the right baseclasses. From-SVN: r26669 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4c8b67fbc2ce..3124a49a6dcd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +1999-04-26 Mark Mitchell + + * search.c (is_subobject_of_p): Make sure we're looking at the + right baseclasses. + 1999-04-26 Marc Espie * Make-lang.in (cplib2.ready): Don't depend on phony targets. diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 7ce65e63f8ed..ca98daaac4af 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -1065,13 +1065,17 @@ is_subobject_of_p (parent, binfo) tree binfos; int i, n_baselinks; + /* We want to canonicalize for comparison purposes. But, when we + iterate through basetypes later, we want the binfos from the + original hierarchy. That's why we have to calculate BINFOS + first, and then canonicalize. */ + binfos = BINFO_BASETYPES (binfo); parent = canonical_binfo (parent); binfo = canonical_binfo (binfo); if (parent == binfo) return 1; - binfos = BINFO_BASETYPES (binfo); n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0; /* Process and/or queue base types. */ diff --git a/gcc/testsuite/g++.old-deja/g++.other/lookup15.C b/gcc/testsuite/g++.old-deja/g++.other/lookup15.C new file mode 100644 index 000000000000..be9096a3be1c --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/lookup15.C @@ -0,0 +1,37 @@ +// Build don't link: +// Origin: Benjamin Kosnik + +class b +{ + int j; +public: + b(int a = 6): j(a) {} + void imbue(int a) {++j;} +}; + +class d: public b +{ + int k; +public: + d(int a = 7): b(a), k(a) {} + void imbue(int a) {++k;} +}; + +//virtual public kills, public ok +class mostd: virtual public d +{ + int l; +public: + mostd(int a = 9): d(a), l(a) {} +}; + +int main() { + + d dobj; + dobj.imbue(5); + + mostd mobj; + mobj.imbue(5); + + return 0; +}