From d2675b98f5792d652be903cb064f10e45ebd558a Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Fri, 23 Apr 1999 10:16:21 +0000 Subject: [PATCH] search.c (is_subobject_of_p): Handle TEMPLATE_TYPE_PARMs and such as base classes. * search.c (is_subobject_of_p): Handle TEMPLATE_TYPE_PARMs and such as base classes. From-SVN: r26601 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/search.c | 20 +++++++++++++------- gcc/testsuite/g++.old-deja/g++.pt/crash40.C | 19 +++++++++++++++++++ 3 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/crash40.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index eeb633eb616..20aeda53861 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +1999-04-23 Mark Mitchell + + * search.c (is_subobject_of_p): Handle TEMPLATE_TYPE_PARMs and + such as base classes. + 1999-04-22 Brendan Kehoe * tree.c (build_exception_variant): Fix typo: use the chain of U, diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 0551474bc69..7ce65e63f8e 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -1062,21 +1062,27 @@ static int is_subobject_of_p (parent, binfo) tree parent, binfo; { - tree binfos = BINFO_BASETYPES (binfo); - int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0; + tree binfos; + int i, n_baselinks; - if (TREE_VIA_VIRTUAL (parent)) - parent = TYPE_BINFO (TREE_TYPE (parent)); - if (TREE_VIA_VIRTUAL (binfo)) - binfo = TYPE_BINFO (TREE_TYPE (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. */ for (i = 0; i < n_baselinks; i++) { - tree base_binfo = canonical_binfo (TREE_VEC_ELT (binfos, i)); + tree base_binfo = TREE_VEC_ELT (binfos, i); + if (!CLASS_TYPE_P (TREE_TYPE (base_binfo))) + /* If we see a TEMPLATE_TYPE_PARM, or some such, as a base + class there's no way to descend into it. */ + continue; + if (is_subobject_of_p (parent, base_binfo)) return 1; } diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash40.C b/gcc/testsuite/g++.old-deja/g++.pt/crash40.C new file mode 100644 index 00000000000..da828d98510 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/crash40.C @@ -0,0 +1,19 @@ +// Build don't link: +// Origin: rch@larissa.sd.bi.ruhr-uni-bochum.de + +template< class X > +struct VB: public virtual X +{}; + +template< class MOPTerm1, class MOPTerm2 > +struct MOPTermUnify +{ + struct MO: + public VB, + public VB + { + void fix() + { + } + }; +};