diff options
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/search.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.pt/crash40.C | 19 |
3 files changed, 37 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index eeb633e..20aeda5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +1999-04-23 Mark Mitchell <mark@codesourcery.com> + + * search.c (is_subobject_of_p): Handle TEMPLATE_TYPE_PARMs and + such as base classes. + 1999-04-22 Brendan Kehoe <brendan@cygnus.com> * 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 0551474..7ce65e6 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 0000000..da828d9 --- /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<MOPTerm1>, + public VB<MOPTerm2> + { + void fix() + { + } + }; +}; |