mirror of
https://github.com/boostorg/intrusive.git
synced 2025-08-02 14:04:36 +02:00
BOOST_INTRUSIVE_MSVC_ABI_PTR_TO_MEMBER was incorrectly undefined so no virtual inheritance was tested in compilers that theoretically support it.
This commit is contained in:
@@ -115,10 +115,6 @@ inline const Parent *parent_from_member(const Member *member, const Member Paren
|
|||||||
} //namespace intrusive {
|
} //namespace intrusive {
|
||||||
} //namespace boost {
|
} //namespace boost {
|
||||||
|
|
||||||
#ifdef BOOST_INTRUSIVE_MSVC_ABI_PTR_TO_MEMBER
|
|
||||||
#undef BOOST_INTRUSIVE_MSVC_ABI_PTR_TO_MEMBER
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <boost/intrusive/detail/config_end.hpp>
|
#include <boost/intrusive/detail/config_end.hpp>
|
||||||
|
|
||||||
#endif //#ifndef BOOST_INTRUSIVE_DETAIL_PARENT_FROM_MEMBER_HPP
|
#endif //#ifndef BOOST_INTRUSIVE_DETAIL_PARENT_FROM_MEMBER_HPP
|
||||||
|
@@ -79,6 +79,24 @@ struct MultiInheritance2
|
|||||||
float multiinheritance2_float_;
|
float multiinheritance2_float_;
|
||||||
} multiinheritance2;
|
} multiinheritance2;
|
||||||
|
|
||||||
|
struct VirtualDerivedPoly
|
||||||
|
: public virtual Derived
|
||||||
|
{
|
||||||
|
int virtualderivedpoly_int_;
|
||||||
|
float virtualderivedpoly_float_;
|
||||||
|
virtual void f1(){}
|
||||||
|
virtual void f2(){}
|
||||||
|
} virtualderivedpoly;
|
||||||
|
|
||||||
|
struct VirtualMultipleDerivedPoly
|
||||||
|
: public virtual Derived, virtual public DerivedPoly
|
||||||
|
{
|
||||||
|
int virtualmultiplederivedpoly_int_;
|
||||||
|
float virtualmultiplederivedpoly_float_;
|
||||||
|
virtual void f1(){}
|
||||||
|
virtual void f2(){}
|
||||||
|
} virtualmultiplederivedpoly;
|
||||||
|
|
||||||
struct VirtualDerived
|
struct VirtualDerived
|
||||||
: public virtual Derived
|
: public virtual Derived
|
||||||
{
|
{
|
||||||
@@ -88,17 +106,10 @@ struct VirtualDerived
|
|||||||
virtual void f2(){}
|
virtual void f2(){}
|
||||||
} virtualderived;
|
} virtualderived;
|
||||||
|
|
||||||
struct VirtualMultipleDerived
|
|
||||||
: public virtual Derived, virtual public DerivedPoly
|
|
||||||
{
|
|
||||||
int virtualmultiplederived_int_;
|
|
||||||
float virtualmultiplederived_float_;
|
|
||||||
virtual void f1(){}
|
|
||||||
virtual void f2(){}
|
|
||||||
} virtualmultiplederived;
|
|
||||||
|
|
||||||
using namespace boost::intrusive;
|
using namespace boost::intrusive;
|
||||||
|
|
||||||
|
//Add new test with https://svn.boost.org/trac/boost/attachment/ticket/8512/Source1.cpp
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
//POD
|
//POD
|
||||||
@@ -141,14 +152,16 @@ int main()
|
|||||||
BOOST_TEST(&multiinheritance2 == get_parent_from_member(&multiinheritance2.derivedpoly2_float_, &MultiInheritance2::derivedpoly2_float_));
|
BOOST_TEST(&multiinheritance2 == get_parent_from_member(&multiinheritance2.derivedpoly2_float_, &MultiInheritance2::derivedpoly2_float_));
|
||||||
|
|
||||||
//MSVC pointer to member data uses RTTI info even when not crossing virtual base boundaries
|
//MSVC pointer to member data uses RTTI info even when not crossing virtual base boundaries
|
||||||
#ifdef BOOST_INTRUSIVE_MSVC_ABI_PTR_TO_MEMBER
|
#ifndef BOOST_INTRUSIVE_MSVC_ABI_PTR_TO_MEMBER
|
||||||
//No access to virtual base data {int_, float_, derived_int_, derived_float_}
|
|
||||||
BOOST_TEST(&virtualderived == get_parent_from_member(&virtualderived.virtualderived_int_, &VirtualDerived::virtualderived_int_));
|
BOOST_TEST(&virtualderived == get_parent_from_member(&virtualderived.virtualderived_int_, &VirtualDerived::virtualderived_int_));
|
||||||
BOOST_TEST(&virtualderived == get_parent_from_member(&virtualderived.virtualderived_float_, &VirtualDerived::virtualderived_float_));
|
BOOST_TEST(&virtualderived == get_parent_from_member(&virtualderived.virtualderived_float_, &VirtualDerived::virtualderived_float_));
|
||||||
BOOST_TEST(&virtualmultiplederived == get_parent_from_member(&virtualmultiplederived.virtualmultiplederived_float_, &VirtualMultipleDerived::virtualmultiplederived_float_));
|
|
||||||
BOOST_TEST(&virtualmultiplederived == get_parent_from_member(&virtualmultiplederived.virtualmultiplederived_int_, &VirtualMultipleDerived::virtualmultiplederived_int_));
|
BOOST_TEST(&virtualderivedpoly == get_parent_from_member(&virtualderivedpoly.virtualderivedpoly_int_, &VirtualDerivedPoly::virtualderivedpoly_int_));
|
||||||
BOOST_TEST(&virtualmultiplederived == get_parent_from_member(&virtualmultiplederived.derivedpoly_float_, &VirtualMultipleDerived::derivedpoly_float_));
|
BOOST_TEST(&virtualderivedpoly == get_parent_from_member(&virtualderivedpoly.virtualderivedpoly_float_, &VirtualDerivedPoly::virtualderivedpoly_float_));
|
||||||
BOOST_TEST(&virtualmultiplederived == get_parent_from_member(&virtualmultiplederived.derivedpoly_int_, &VirtualMultipleDerived::derivedpoly_int_));
|
BOOST_TEST(&virtualmultiplederivedpoly == get_parent_from_member(&virtualmultiplederivedpoly.virtualmultiplederivedpoly_float_, &VirtualMultipleDerivedPoly::virtualmultiplederivedpoly_float_));
|
||||||
|
BOOST_TEST(&virtualmultiplederivedpoly == get_parent_from_member(&virtualmultiplederivedpoly.virtualmultiplederivedpoly_int_, &VirtualMultipleDerivedPoly::virtualmultiplederivedpoly_int_));
|
||||||
|
BOOST_TEST(&virtualmultiplederivedpoly == get_parent_from_member(&virtualmultiplederivedpoly.derivedpoly_float_, &VirtualMultipleDerivedPoly::derivedpoly_float_));
|
||||||
|
BOOST_TEST(&virtualmultiplederivedpoly == get_parent_from_member(&virtualmultiplederivedpoly.derivedpoly_int_, &VirtualMultipleDerivedPoly::derivedpoly_int_));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return boost::report_errors();
|
return boost::report_errors();
|
||||||
|
Reference in New Issue
Block a user