aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog12
-rw-r--r--gcc/cp/search.c26
-rw-r--r--gcc/cp/tinfo.cc6
-rw-r--r--gcc/cp/tinfo.h12
-rw-r--r--gcc/cp/tinfo2.cc4
5 files changed, 37 insertions, 23 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index c123e53..074c0b0 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,15 @@
+2000-01-20 Nathan Sidwell <sidwell@codesourcery.com>
+
+ Remap dynamic cast hint values to be consistent across ABIs.
+ * search.c (dynamic_cast_base_recurse): Remap generated value.
+ (get_dynamic_cast_base_type): Adjust documentation.
+ * tinfo.h (__user_type_info::dyncast): Likewise.
+ (__user_type_info::find_public_subobj): Remap BOFF meaning.
+ * tinfo.cc (__si_type_info::do_dyncast): Remap BOFF meaning.
+ (__class_type_info::do_dyncast): Likewise.
+ (__class_type_info::do_find_public_subobj): Likewise.
+ * tinfo2.cc (__dynamic_cast): Remap BOFF parameter.
+
2000-01-19 Gabriel Dos Reis <gdr@codesourcery.coom>
* typeck.c (build_unary_op): Use cp_pedwarn, not pedwarn.
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index d29cdb5..390c974 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -503,12 +503,12 @@ dynamic_cast_base_recurse (subtype, binfo, via_virtual, offset_ptr)
{
tree binfos;
int i, n_baselinks;
- int worst = -3;
+ int worst = -2;
if (BINFO_TYPE (binfo) == subtype)
{
if (via_virtual)
- return -2;
+ return -1;
else
{
*offset_ptr = BINFO_OFFSET (binfo);
@@ -528,26 +528,28 @@ dynamic_cast_base_recurse (subtype, binfo, via_virtual, offset_ptr)
rval = dynamic_cast_base_recurse
(subtype, base_binfo,
via_virtual || TREE_VIA_VIRTUAL (base_binfo), offset_ptr);
- if (worst == -3)
+ if (worst == -2)
worst = rval;
else if (rval >= 0)
- worst = worst >= 0 ? -1 : worst;
- else if (rval > -3)
- worst = worst < rval ? worst : rval;
+ worst = worst >= 0 ? -3 : worst;
+ else if (rval == -1)
+ worst = -1;
+ else if (rval == -3 && worst != -1)
+ worst = -3;
}
return worst;
}
-/* The dynamic cast runtime needs a hint about how the static SUBTYPE type started
- from is related to the required TARGET type, in order to optimize the
- inheritance graph search. This information is independant of the
+/* The dynamic cast runtime needs a hint about how the static SUBTYPE type
+ started from is related to the required TARGET type, in order to optimize
+ the inheritance graph search. This information is independant of the
current context, and ignores private paths, hence get_base_distance is
inappropriate. Return a TREE specifying the base offset, BOFF.
BOFF >= 0, there is only one public non-virtual SUBTYPE base at offset BOFF,
and there are no public virtual SUBTYPE bases.
- BOFF == -1, SUBTYPE occurs as multiple public non-virtual bases.
- BOFF == -2, SUBTYPE occurs as multiple public virtual or non-virtual bases.
- BOFF == -3, SUBTYPE is not a public base. */
+ BOFF == -1, SUBTYPE occurs as multiple public virtual or non-virtual bases.
+ BOFF == -2, SUBTYPE is not a public base.
+ BOFF == -3, SUBTYPE occurs as multiple public non-virtual bases. */
tree
get_dynamic_cast_base_type (subtype, target)
diff --git a/gcc/cp/tinfo.cc b/gcc/cp/tinfo.cc
index 18a00b0..1ad5840 100644
--- a/gcc/cp/tinfo.cc
+++ b/gcc/cp/tinfo.cc
@@ -243,7 +243,7 @@ do_dyncast (int boff, sub_kind access_path,
if (boff >= 0)
result.target2sub = ((char *)subptr - (char *)objptr) == boff
? contained_public : not_contained;
- else if (boff == -3)
+ else if (boff == -2)
result.target2sub = not_contained;
return false;
}
@@ -361,7 +361,7 @@ do_dyncast (int boff, sub_kind access_path,
if (boff >= 0)
result.target2sub = ((char *)subptr - (char *)objptr) == boff
? contained_public : not_contained;
- else if (boff == -3)
+ else if (boff == -2)
result.target2sub = not_contained;
return false;
}
@@ -519,7 +519,7 @@ do_find_public_subobj (int boff, const type_info &subtype, void *objptr, void *s
continue; // Not public, can't be here.
void *p;
- if (base_list[i].is_virtual && boff == -1)
+ if (base_list[i].is_virtual && boff == -3)
// Not a virtual base, so can't be here.
continue;
diff --git a/gcc/cp/tinfo.h b/gcc/cp/tinfo.h
index 116c7a8..91d52bd 100644
--- a/gcc/cp/tinfo.h
+++ b/gcc/cp/tinfo.h
@@ -24,12 +24,12 @@ struct __user_type_info : public std::type_info {
// BOFF >= 0, there is only one public non-virtual SUBTYPE base at offset
// BOFF, and there are no public virtual SUBTYPE bases.
// Therefore check if SUBOBJ is at offset BOFF when we find a target
- // BOFF == -1, SUBTYPE occurs as multiple public non-virtual bases.
- // Lazily search the non-virtual bases of TARGET.
- // BOFF == -2, SUBTYPE occurs as multiple public virtual or non-virtual bases.
+ // BOFF == -1, SUBTYPE occurs as multiple public virtual or non-virtual bases.
// Lazily search all the bases of TARGET.
- // BOFF == -3, SUBTYPE is not a public base.
- // For backwards compatibility set BOFF to -2, that is the safe `don't know'
+ // BOFF == -2, SUBTYPE is not a public base.
+ // BOFF == -3, SUBTYPE occurs as multiple public non-virtual bases.
+ // Lazily search the non-virtual bases of TARGET.
+ // For backwards compatibility set BOFF to -1, that is the safe `don't know'
// value. We don't care about SUBTYPES as private bases of TARGET, as they
// can never succeed as downcasts, only as crosscasts -- and then only if
// they are virtual. This is more complicated that it might seem.
@@ -131,7 +131,7 @@ struct __user_type_info : public std::type_info {
if (boff >= 0)
return ((char *)subptr - (char *)objptr) == boff
? contained_public : not_contained;
- if (boff == -3)
+ if (boff == -2)
return not_contained;
return do_find_public_subobj (boff, subtype, objptr, subptr);
}
diff --git a/gcc/cp/tinfo2.cc b/gcc/cp/tinfo2.cc
index f24b59b..f1b9d92 100644
--- a/gcc/cp/tinfo2.cc
+++ b/gcc/cp/tinfo2.cc
@@ -1,5 +1,5 @@
// Methods for type_info for -*- C++ -*- Run Time Type Identification.
-// Copyright (C) 1994, 96-97, 1998, 1999 Free Software Foundation
+// Copyright (C) 1994, 96-97, 1998, 1999, 2000 Free Software Foundation
// This file is part of GNU CC.
@@ -274,7 +274,7 @@ __dynamic_cast (const type_info& (*from)(void), const type_info& (*to)(void),
{
if (!require_public) abort();
return static_cast <__user_type_info const &> (from ()).dyncast
- (/*boff=*/-2, to (), address, sub (), subptr);
+ (/*boff=*/-1, to (), address, sub (), subptr);
}
extern "C" void *