aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/search.c20
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/crash40.C19
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()
+ {
+ }
+ };
+};