Fix using weak references to incomplete classes.
wxWeakRef can work with forward-declared classes provided dynamic_cast<> is available but this wasn't detected as being the case due to the use of the obsolete HAVE_DYNAMIC_CAST in its code. Replace HAVE_DYNAMIC_CAST with !wxNO_RTTI to fix this. Also add a unit test checking that this does work. Closes #11916. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63986 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -149,7 +149,7 @@ protected:
|
|||||||
DoAssign( pobj, ptbase );
|
DoAssign( pobj, ptbase );
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_DYNAMIC_CAST
|
#ifndef wxNO_RTTI
|
||||||
void AssignHelper(T* pobj, wxInt2Type<false>)
|
void AssignHelper(T* pobj, wxInt2Type<false>)
|
||||||
{
|
{
|
||||||
// A last way to get a trackable pointer
|
// A last way to get a trackable pointer
|
||||||
@@ -165,7 +165,7 @@ protected:
|
|||||||
Release();
|
Release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // HAVE_DYNAMIC_CAST
|
#endif // RTTI enabled
|
||||||
|
|
||||||
void AssignCopy(const wxWeakRefImpl& wr)
|
void AssignCopy(const wxWeakRefImpl& wr)
|
||||||
{
|
{
|
||||||
@@ -254,7 +254,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_DYNAMIC_CAST
|
#ifndef wxNO_RTTI
|
||||||
|
|
||||||
// Weak ref implementation assign objects are queried for wxTrackable
|
// Weak ref implementation assign objects are queried for wxTrackable
|
||||||
// using dynamic_cast<>
|
// using dynamic_cast<>
|
||||||
@@ -338,7 +338,7 @@ protected:
|
|||||||
T *m_pobj;
|
T *m_pobj;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // #ifdef HAVE_DYNAMIC_CAST
|
#endif // RTTI enabled
|
||||||
|
|
||||||
|
|
||||||
// Provide some basic types of weak references
|
// Provide some basic types of weak references
|
||||||
|
@@ -76,6 +76,14 @@ CPPUNIT_TEST_SUITE_REGISTRATION( WeakRefTestCase );
|
|||||||
// also include in it's own registry so that these tests can be run alone
|
// also include in it's own registry so that these tests can be run alone
|
||||||
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( WeakRefTestCase, "WeakRefTestCase" );
|
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( WeakRefTestCase, "WeakRefTestCase" );
|
||||||
|
|
||||||
|
|
||||||
|
// Test weak reference to an incomplete type, this should work if the type is
|
||||||
|
// fully defined before it is used (but currently doesn't, see #11916)
|
||||||
|
struct ForwardDeclaredClass;
|
||||||
|
wxWeakRef<ForwardDeclaredClass> g_incompleteWeakRef;
|
||||||
|
|
||||||
|
struct ForwardDeclaredClass : wxEvtHandler { };
|
||||||
|
|
||||||
void WeakRefTestCase::DeclareTest()
|
void WeakRefTestCase::DeclareTest()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@@ -110,6 +118,17 @@ void WeakRefTestCase::DeclareTest()
|
|||||||
CPPUNIT_ASSERT( wreh.get() == &eh );
|
CPPUNIT_ASSERT( wreh.get() == &eh );
|
||||||
CPPUNIT_ASSERT( wrot.get() == &ot );
|
CPPUNIT_ASSERT( wrot.get() == &ot );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This test requires a working dynamic_cast<>
|
||||||
|
#ifndef wxNO_RTTI
|
||||||
|
{
|
||||||
|
ForwardDeclaredClass fdc;
|
||||||
|
g_incompleteWeakRef = &fdc;
|
||||||
|
CPPUNIT_ASSERT( g_incompleteWeakRef );
|
||||||
|
}
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT( !g_incompleteWeakRef );
|
||||||
|
#endif // RTTI enabled
|
||||||
}
|
}
|
||||||
|
|
||||||
void WeakRefTestCase::AssignTest()
|
void WeakRefTestCase::AssignTest()
|
||||||
|
Reference in New Issue
Block a user