This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

RTTI library functions int <-> ptrdiff_t confusion


The RTTI library functions mix up int and ptrdiff_t.  This causes the code
to break on targets with 16 bit ints and 32 bit pointers.
That is true both of libstdc++ and libstdc++-v3.
I suppose you don't see the berakage immediately on targets with 32 bit
ints and 64 bit pointers using little endian because a sufficient number
of arguments are passed in registers, and the bits happen to end up in
the right place.  However, when you really need these 64 bit pointers,
things are going top break there too.

I think this should be addressed before gcc 3.0 is released, to avoid
changing the ABI later.

libstdc++:

Wed Jan 31 12:10:51 2001  J"orn Rennecke <amylaar@redhat.com>

	* tinfo.cc (dyncast, do_dyncast, do_find_public_subobj): First
	argument has type ptrdiff_t.
	* tinfo.hP (dyncast, do_dyncast, do_find_public_subobj): Likewise.
	* tinfo2.cc (__dynamic_cast_2): Third argument has type ptrdiff_t.

Index: libstdc++/tinfo.cc
===================================================================
RCS file: /cvs/cvsfiles/devo/libstdc++/tinfo.cc,v
retrieving revision 1.2
retrieving revision 1.2.22.1
diff -p -r1.2 -r1.2.22.1
*** tinfo.cc	2000/11/12 19:09:24	1.2
--- tinfo.cc	2001/01/31 12:35:28	1.2.22.1
*************** upcast (const type_info &target, void *o
*** 111,117 ****
  // separately unambiguous and public, rather than unambiguous considering only
  // public bases.
  void *__user_type_info::
! dyncast (int boff,
           const type_info &target, void *objptr,
           const type_info &subtype, void *subptr) const
  {
--- 111,117 ----
  // separately unambiguous and public, rather than unambiguous considering only
  // public bases.
  void *__user_type_info::
! dyncast (ptrdiff_t boff,
           const type_info &target, void *objptr,
           const type_info &subtype, void *subptr) const
  {
*************** do_upcast (sub_kind access_path,
*** 166,172 ****
  // Fill in RESULT with what we find. Return true if we have located an
  // ambiguous match.
  bool __user_type_info::
! do_dyncast (int, sub_kind access_path,
              const type_info &target, void *objptr,
              const type_info &subtype, void *subptr,
              dyncast_result &__restrict result) const
--- 166,172 ----
  // Fill in RESULT with what we find. Return true if we have located an
  // ambiguous match.
  bool __user_type_info::
! do_dyncast (ptrdiff_t, sub_kind access_path,
              const type_info &target, void *objptr,
              const type_info &subtype, void *subptr,
              dyncast_result &__restrict result) const
*************** do_dyncast (int, sub_kind access_path,
*** 192,198 ****
  // subtype. OBJPTR points to this base type, SUBPTR points to the desired base
  // object.
  __user_type_info::sub_kind __user_type_info::
! do_find_public_subobj (int, const type_info &, void *objptr, void *subptr) const
  {
    if (subptr == objptr)
      // Must be our type, as the pointers match.
--- 192,198 ----
  // subtype. OBJPTR points to this base type, SUBPTR points to the desired base
  // object.
  __user_type_info::sub_kind __user_type_info::
! do_find_public_subobj (ptrdiff_t, const type_info &, void *objptr, void *subptr) const
  {
    if (subptr == objptr)
      // Must be our type, as the pointers match.
*************** do_upcast (sub_kind access_path,
*** 221,227 ****
  // __user_type_info::do_dyncast for semantics. BOFF indicates how SUBTYPE
  // types are inherited by TARGET types.
  bool __si_type_info::
! do_dyncast (int boff, sub_kind access_path,
              const type_info &target, void *objptr,
              const type_info &subtype, void *subptr,
              dyncast_result &__restrict result) const
--- 221,227 ----
  // __user_type_info::do_dyncast for semantics. BOFF indicates how SUBTYPE
  // types are inherited by TARGET types.
  bool __si_type_info::
! do_dyncast (ptrdiff_t boff, sub_kind access_path,
              const type_info &target, void *objptr,
              const type_info &subtype, void *subptr,
              dyncast_result &__restrict result) const
*************** do_dyncast (int boff, sub_kind access_pa
*** 252,258 ****
  // semantics. BOFF indicates how SUBTYPE types are inherited by the original
  // target object.
  __user_type_info::sub_kind __si_type_info::
! do_find_public_subobj (int boff, const type_info &subtype, void *objptr, void *subptr) const
  {
    if (subptr == objptr && subtype == *this)
      return contained_public;
--- 252,258 ----
  // semantics. BOFF indicates how SUBTYPE types are inherited by the original
  // target object.
  __user_type_info::sub_kind __si_type_info::
! do_find_public_subobj (ptrdiff_t boff, const type_info &subtype, void *objptr, void *subptr) const
  {
    if (subptr == objptr && subtype == *this)
      return contained_public;
*************** do_upcast (sub_kind access_path,
*** 342,348 ****
  // work by filling in things lazily (when we know we need the information),
  // and opportunisticly take early success or failure results.
  bool __class_type_info::
! do_dyncast (int boff, sub_kind access_path,
              const type_info &target, void *objptr,
              const type_info &subtype, void *subptr,
              dyncast_result &__restrict result) const
--- 342,348 ----
  // work by filling in things lazily (when we know we need the information),
  // and opportunisticly take early success or failure results.
  bool __class_type_info::
! do_dyncast (ptrdiff_t boff, sub_kind access_path,
              const type_info &target, void *objptr,
              const type_info &subtype, void *subptr,
              dyncast_result &__restrict result) const
*************** do_dyncast (int boff, sub_kind access_pa
*** 508,514 ****
  // __user_type_info::do_find_public_subobj for semantics. We make use of BOFF
  // to prune the base class walk.
  __user_type_info::sub_kind __class_type_info::
! do_find_public_subobj (int boff, const type_info &subtype, void *objptr, void *subptr) const
  {
    if (objptr == subptr && subtype == *this)
      return contained_public;
--- 508,514 ----
  // __user_type_info::do_find_public_subobj for semantics. We make use of BOFF
  // to prune the base class walk.
  __user_type_info::sub_kind __class_type_info::
! do_find_public_subobj (ptrdiff_t boff, const type_info &subtype, void *objptr, void *subptr) const
  {
    if (objptr == subptr && subtype == *this)
      return contained_public;
Index: libstdc++/tinfo.hP
===================================================================
RCS file: /cvs/cvsfiles/devo/libstdc++/tinfo.hP,v
retrieving revision 1.2
retrieving revision 1.2.22.1
diff -p -r1.2 -r1.2.22.1
*** tinfo.hP	2000/11/12 19:09:24	1.2
--- tinfo.hP	2001/01/31 12:35:28	1.2.22.1
*************** struct __user_type_info : public std::ty
*** 36,42 ****
    // value. We do not 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.
!   void *dyncast (int boff,
                   const type_info &target, void *obj,
                   const type_info &subtype, void *subobj) const;
    
--- 36,42 ----
    // value. We do not 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.
!   void *dyncast (ptrdiff_t boff,
                   const type_info &target, void *obj,
                   const type_info &subtype, void *subobj) const;
    
*************** struct __user_type_info : public std::ty
*** 123,129 ****
    // ACCESS_PATH indicates the access from the most derived object.  It is
    // used to prune the DAG walk. All information about what we find is put
    // into RESULT. Return true, if the match we have found is ambiguous.
!   virtual bool do_dyncast (int boff, sub_kind access_path,
                             const type_info &target, void *obj,
                             const type_info &subtype, void *subptr,
                             dyncast_result &__restrict result) const;
--- 123,129 ----
    // ACCESS_PATH indicates the access from the most derived object.  It is
    // used to prune the DAG walk. All information about what we find is put
    // into RESULT. Return true, if the match we have found is ambiguous.
!   virtual bool do_dyncast (ptrdiff_t boff, sub_kind access_path,
                             const type_info &target, void *obj,
                             const type_info &subtype, void *subptr,
                             dyncast_result &__restrict result) const;
*************** struct __user_type_info : public std::ty
*** 133,139 ****
    // objects might be contained within this type.  If SUBPTR is one of our
    // SUBTYPE bases, indicate virtuality. Returns not_contained for non
    // containment or private containment.
!   sub_kind find_public_subobj (int boff, const type_info &subtype,
                                 void *objptr, void *subptr) const
    {
      if (boff >= 0)
--- 133,139 ----
    // objects might be contained within this type.  If SUBPTR is one of our
    // SUBTYPE bases, indicate virtuality. Returns not_contained for non
    // containment or private containment.
!   sub_kind find_public_subobj (ptrdiff_t boff, const type_info &subtype,
                                 void *objptr, void *subptr) const
    {
      if (boff >= 0)
*************** struct __user_type_info : public std::ty
*** 148,154 ****
    // Helper for find_subobj. BOFF indicates how SUBTYPE bases are inherited by
    // the type started from -- which is not necessarily the current type.
    // OBJPTR points to the current base.
!   virtual sub_kind do_find_public_subobj (int boff, const type_info &subtype,
                                            void *objptr, void *subptr) const;
  };
  
--- 148,155 ----
    // Helper for find_subobj. BOFF indicates how SUBTYPE bases are inherited by
    // the type started from -- which is not necessarily the current type.
    // OBJPTR points to the current base.
!   virtual sub_kind do_find_public_subobj (ptrdiff_t boff,
! 					  const type_info &subtype,
                                            void *objptr, void *subptr) const;
  };
  
*************** public:
*** 165,175 ****
    virtual bool do_upcast (sub_kind access_path,
                            const type_info &target, void *obj,
                            upcast_result &__restrict result) const;
!   virtual bool do_dyncast (int boff, sub_kind access_path,
                             const type_info &target, void *obj,
                             const type_info &subtype, void *subptr,
                             dyncast_result &__restrict result) const;
!   virtual sub_kind do_find_public_subobj (int boff, const type_info &subtype,
                                            void *objptr, void *subptr) const;
  };
  
--- 166,177 ----
    virtual bool do_upcast (sub_kind access_path,
                            const type_info &target, void *obj,
                            upcast_result &__restrict result) const;
!   virtual bool do_dyncast (ptrdiff_t boff, sub_kind access_path,
                             const type_info &target, void *obj,
                             const type_info &subtype, void *subptr,
                             dyncast_result &__restrict result) const;
!   virtual sub_kind do_find_public_subobj (ptrdiff_t boff,
! 					  const type_info &subtype,
                                            void *objptr, void *subptr) const;
  };
  
*************** struct __class_type_info : public __user
*** 209,219 ****
    virtual bool do_upcast (sub_kind access_path,
                            const type_info &target, void *obj,
                            upcast_result &__restrict result) const;
!   virtual bool do_dyncast (int boff, sub_kind access_path,
                             const type_info &target, void *obj,
                             const type_info &subtype, void *subptr,
                             dyncast_result &__restrict result) const;
!   virtual sub_kind do_find_public_subobj (int boff, const type_info &subtype,
                                            void *objptr, void *subptr) const;
  };
  #else
--- 211,222 ----
    virtual bool do_upcast (sub_kind access_path,
                            const type_info &target, void *obj,
                            upcast_result &__restrict result) const;
!   virtual bool do_dyncast (ptrdiff_t boff, sub_kind access_path,
                             const type_info &target, void *obj,
                             const type_info &subtype, void *subptr,
                             dyncast_result &__restrict result) const;
!   virtual sub_kind do_find_public_subobj (ptrdiff_t boff,
! 					  const type_info &subtype,
                                            void *objptr, void *subptr) const;
  };
  #else
Index: libstdc++/tinfo2.cc
===================================================================
RCS file: /cvs/cvsfiles/devo/libstdc++/tinfo2.cc,v
retrieving revision 1.2
retrieving revision 1.2.22.1
diff -p -r1.2 -r1.2.22.1
*** tinfo2.cc	2000/11/12 19:09:24	1.2
--- tinfo2.cc	2001/01/31 12:35:28	1.2.22.1
*************** __dynamic_cast (const type_info& (*from)
*** 420,431 ****
  {
    if (!require_public) abort();
    return static_cast <__user_type_info const &> (from ()).dyncast
!       (/*boff=*/-1, to (), address, sub (), subptr);
  }
  
  extern "C" void *
  __dynamic_cast_2 (const type_info& (*from)(void), const type_info& (*to)(void),
!                   int boff,
  		  void *address, const type_info & (*sub)(void), void *subptr)
  {
    return static_cast <__user_type_info const &> (from ()).dyncast
--- 420,431 ----
  {
    if (!require_public) abort();
    return static_cast <__user_type_info const &> (from ()).dyncast
!       (/*boff=*/(ptrdiff_t)-1, to (), address, sub (), subptr);
  }
  
  extern "C" void *
  __dynamic_cast_2 (const type_info& (*from)(void), const type_info& (*to)(void),
!                   ptrdiff_t boff,
  		  void *address, const type_info & (*sub)(void), void *subptr)
  {
    return static_cast <__user_type_info const &> (from ()).dyncast

libstdc++-v3:

Sat Feb  3 02:57:30 2001  J"orn Rennecke <amylaar@redhat.com>

	* libsupc++/tinfo.h (dyncast, do_dyncast): First argument is ptrdiff_t.
	(find_public_subobj, do_find_public_subobj): Likewise.
	* libsupc++/tinfo.cc (dynacst, do_dyncast): Likewise.
	(do_find_public_subobj): Likewise.
	* libsupc++/tinfo2.cc (__dynamic_cast_2): Third argument is ptrdiff_t.

Index: libstdc++-v3/libsupc++/tinfo.cc
===================================================================
RCS file: /cvs/cvsfiles/devo/libstdc++-v3/libsupc++/tinfo.cc,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.24.1
diff -p -r1.1.1.1 -r1.1.1.1.24.1
*** tinfo.cc	2000/11/12 19:23:08	1.1.1.1
--- tinfo.cc	2001/02/03 03:04:46	1.1.1.1.24.1
*************** upcast (const type_info &target, void *o
*** 111,117 ****
  // separately unambiguous and public, rather than unambiguous considering only
  // public bases.
  void *__user_type_info::
! dyncast (int boff,
           const type_info &target, void *objptr,
           const type_info &subtype, void *subptr) const
  {
--- 111,117 ----
  // separately unambiguous and public, rather than unambiguous considering only
  // public bases.
  void *__user_type_info::
! dyncast (ptrdiff_t boff,
           const type_info &target, void *objptr,
           const type_info &subtype, void *subptr) const
  {
*************** do_upcast (sub_kind access_path,
*** 166,172 ****
  // Fill in RESULT with what we find. Return true if we have located an
  // ambiguous match.
  bool __user_type_info::
! do_dyncast (int, sub_kind access_path,
              const type_info &target, void *objptr,
              const type_info &subtype, void *subptr,
              dyncast_result &__restrict result) const
--- 166,172 ----
  // Fill in RESULT with what we find. Return true if we have located an
  // ambiguous match.
  bool __user_type_info::
! do_dyncast (ptrdiff_t, sub_kind access_path,
              const type_info &target, void *objptr,
              const type_info &subtype, void *subptr,
              dyncast_result &__restrict result) const
*************** do_dyncast (int, sub_kind access_path,
*** 192,198 ****
  // subtype. OBJPTR points to this base type, SUBPTR points to the desired base
  // object.
  __user_type_info::sub_kind __user_type_info::
! do_find_public_subobj (int, const type_info &, void *objptr, void *subptr) const
  {
    if (subptr == objptr)
      // Must be our type, as the pointers match.
--- 192,198 ----
  // subtype. OBJPTR points to this base type, SUBPTR points to the desired base
  // object.
  __user_type_info::sub_kind __user_type_info::
! do_find_public_subobj (ptrdiff_t, const type_info &, void *objptr, void *subptr) const
  {
    if (subptr == objptr)
      // Must be our type, as the pointers match.
*************** do_upcast (sub_kind access_path,
*** 221,227 ****
  // __user_type_info::do_dyncast for semantics. BOFF indicates how SUBTYPE
  // types are inherited by TARGET types.
  bool __si_type_info::
! do_dyncast (int boff, sub_kind access_path,
              const type_info &target, void *objptr,
              const type_info &subtype, void *subptr,
              dyncast_result &__restrict result) const
--- 221,227 ----
  // __user_type_info::do_dyncast for semantics. BOFF indicates how SUBTYPE
  // types are inherited by TARGET types.
  bool __si_type_info::
! do_dyncast (ptrdiff_t boff, sub_kind access_path,
              const type_info &target, void *objptr,
              const type_info &subtype, void *subptr,
              dyncast_result &__restrict result) const
*************** do_dyncast (int boff, sub_kind access_pa
*** 252,258 ****
  // semantics. BOFF indicates how SUBTYPE types are inherited by the original
  // target object.
  __user_type_info::sub_kind __si_type_info::
! do_find_public_subobj (int boff, const type_info &subtype, void *objptr, void *subptr) const
  {
    if (subptr == objptr && subtype == *this)
      return contained_public;
--- 252,258 ----
  // semantics. BOFF indicates how SUBTYPE types are inherited by the original
  // target object.
  __user_type_info::sub_kind __si_type_info::
! do_find_public_subobj (ptrdiff_t boff, const type_info &subtype, void *objptr, void *subptr) const
  {
    if (subptr == objptr && subtype == *this)
      return contained_public;
*************** do_upcast (sub_kind access_path,
*** 342,348 ****
  // work by filling in things lazily (when we know we need the information),
  // and opportunisticly take early success or failure results.
  bool __class_type_info::
! do_dyncast (int boff, sub_kind access_path,
              const type_info &target, void *objptr,
              const type_info &subtype, void *subptr,
              dyncast_result &__restrict result) const
--- 342,348 ----
  // work by filling in things lazily (when we know we need the information),
  // and opportunisticly take early success or failure results.
  bool __class_type_info::
! do_dyncast (ptrdiff_t boff, sub_kind access_path,
              const type_info &target, void *objptr,
              const type_info &subtype, void *subptr,
              dyncast_result &__restrict result) const
*************** do_dyncast (int boff, sub_kind access_pa
*** 508,514 ****
  // __user_type_info::do_find_public_subobj for semantics. We make use of BOFF
  // to prune the base class walk.
  __user_type_info::sub_kind __class_type_info::
! do_find_public_subobj (int boff, const type_info &subtype, void *objptr, void *subptr) const
  {
    if (objptr == subptr && subtype == *this)
      return contained_public;
--- 508,514 ----
  // __user_type_info::do_find_public_subobj for semantics. We make use of BOFF
  // to prune the base class walk.
  __user_type_info::sub_kind __class_type_info::
! do_find_public_subobj (ptrdiff_t boff, const type_info &subtype, void *objptr, void *subptr) const
  {
    if (objptr == subptr && subtype == *this)
      return contained_public;
Index: libstdc++-v3/libsupc++/tinfo.h
===================================================================
RCS file: /cvs/cvsfiles/devo/libstdc++-v3/libsupc++/tinfo.h,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.24.1
diff -p -r1.1.1.1 -r1.1.1.1.24.1
*** tinfo.h	2000/11/12 19:23:08	1.1.1.1
--- tinfo.h	2001/02/03 03:04:46	1.1.1.1.24.1
*************** struct __user_type_info : public std::ty
*** 37,43 ****
    // value. We do not 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.
!   void *dyncast (int boff,
                   const type_info &target, void *obj,
                   const type_info &subtype, void *subobj) const;
    
--- 37,43 ----
    // value. We do not 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.
!   void *dyncast (ptrdiff_t boff,
                   const type_info &target, void *obj,
                   const type_info &subtype, void *subobj) const;
    
*************** struct __user_type_info : public std::ty
*** 124,130 ****
    // ACCESS_PATH indicates the access from the most derived object.  It is
    // used to prune the DAG walk. All information about what we find is put
    // into RESULT. Return true, if the match we have found is ambiguous.
!   virtual bool do_dyncast (int boff, sub_kind access_path,
                             const type_info &target, void *obj,
                             const type_info &subtype, void *subptr,
                             dyncast_result &__restrict result) const;
--- 124,130 ----
    // ACCESS_PATH indicates the access from the most derived object.  It is
    // used to prune the DAG walk. All information about what we find is put
    // into RESULT. Return true, if the match we have found is ambiguous.
!   virtual bool do_dyncast (ptrdiff_t boff, sub_kind access_path,
                             const type_info &target, void *obj,
                             const type_info &subtype, void *subptr,
                             dyncast_result &__restrict result) const;
*************** struct __user_type_info : public std::ty
*** 134,140 ****
    // objects might be contained within this type.  If SUBPTR is one of our
    // SUBTYPE bases, indicate virtuality. Returns not_contained for non
    // containment or private containment.
!   sub_kind find_public_subobj (int boff, const type_info &subtype,
                                 void *objptr, void *subptr) const
    {
      if (boff >= 0)
--- 134,140 ----
    // objects might be contained within this type.  If SUBPTR is one of our
    // SUBTYPE bases, indicate virtuality. Returns not_contained for non
    // containment or private containment.
!   sub_kind find_public_subobj (ptrdiff_t boff, const type_info &subtype,
                                 void *objptr, void *subptr) const
    {
      if (boff >= 0)
*************** struct __user_type_info : public std::ty
*** 149,155 ****
    // Helper for find_subobj. BOFF indicates how SUBTYPE bases are inherited by
    // the type started from -- which is not necessarily the current type.
    // OBJPTR points to the current base.
!   virtual sub_kind do_find_public_subobj (int boff, const type_info &subtype,
                                            void *objptr, void *subptr) const;
  };
  
--- 149,155 ----
    // Helper for find_subobj. BOFF indicates how SUBTYPE bases are inherited by
    // the type started from -- which is not necessarily the current type.
    // OBJPTR points to the current base.
!   virtual sub_kind do_find_public_subobj (ptrdiff_t boff, const type_info &subtype,
                                            void *objptr, void *subptr) const;
  };
  
*************** public:
*** 166,176 ****
    virtual bool do_upcast (sub_kind access_path,
                            const type_info &target, void *obj,
                            upcast_result &__restrict result) const;
!   virtual bool do_dyncast (int boff, sub_kind access_path,
                             const type_info &target, void *obj,
                             const type_info &subtype, void *subptr,
                             dyncast_result &__restrict result) const;
!   virtual sub_kind do_find_public_subobj (int boff, const type_info &subtype,
                                            void *objptr, void *subptr) const;
  };
  
--- 166,176 ----
    virtual bool do_upcast (sub_kind access_path,
                            const type_info &target, void *obj,
                            upcast_result &__restrict result) const;
!   virtual bool do_dyncast (ptrdiff_t boff, sub_kind access_path,
                             const type_info &target, void *obj,
                             const type_info &subtype, void *subptr,
                             dyncast_result &__restrict result) const;
!   virtual sub_kind do_find_public_subobj (ptrdiff_t boff, const type_info &subtype,
                                            void *objptr, void *subptr) const;
  };
  
*************** struct __class_type_info : public __user
*** 210,220 ****
    virtual bool do_upcast (sub_kind access_path,
                            const type_info &target, void *obj,
                            upcast_result &__restrict result) const;
!   virtual bool do_dyncast (int boff, sub_kind access_path,
                             const type_info &target, void *obj,
                             const type_info &subtype, void *subptr,
                             dyncast_result &__restrict result) const;
!   virtual sub_kind do_find_public_subobj (int boff, const type_info &subtype,
                                            void *objptr, void *subptr) const;
  };
  #else
--- 210,220 ----
    virtual bool do_upcast (sub_kind access_path,
                            const type_info &target, void *obj,
                            upcast_result &__restrict result) const;
!   virtual bool do_dyncast (ptrdiff_t boff, sub_kind access_path,
                             const type_info &target, void *obj,
                             const type_info &subtype, void *subptr,
                             dyncast_result &__restrict result) const;
!   virtual sub_kind do_find_public_subobj (ptrdiff_t boff, const type_info &subtype,
                                            void *objptr, void *subptr) const;
  };
  #else
Index: libstdc++-v3/libsupc++/tinfo2.cc
===================================================================
RCS file: /cvs/cvsfiles/devo/libstdc++-v3/libsupc++/tinfo2.cc,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.24.1
diff -p -r1.1.1.1 -r1.1.1.1.24.1
*** tinfo2.cc	2000/11/12 19:23:08	1.1.1.1
--- tinfo2.cc	2001/02/03 03:04:46	1.1.1.1.24.1
*************** __dynamic_cast (const type_info& (*from)
*** 425,431 ****
  
  extern "C" void *
  __dynamic_cast_2 (const type_info& (*from)(void), const type_info& (*to)(void),
!                   int boff,
  		  void *address, const type_info & (*sub)(void), void *subptr)
  {
    return static_cast <__user_type_info const &> (from ()).dyncast
--- 425,431 ----
  
  extern "C" void *
  __dynamic_cast_2 (const type_info& (*from)(void), const type_info& (*to)(void),
!                   ptrdiff_t boff,
  		  void *address, const type_info & (*sub)(void), void *subptr)
  {
    return static_cast <__user_type_info const &> (from ()).dyncast


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]