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
DoAssign( pobj, ptbase );
}
DoAssign( pobj, ptbase );
}
-#ifdef HAVE_DYNAMIC_CAST
void AssignHelper(T* pobj, wxInt2Type<false>)
{
// A last way to get a trackable pointer
void AssignHelper(T* pobj, wxInt2Type<false>)
{
// A last way to get a trackable pointer
-#endif // HAVE_DYNAMIC_CAST
void AssignCopy(const wxWeakRefImpl& wr)
{
void AssignCopy(const wxWeakRefImpl& wr)
{
-#ifdef HAVE_DYNAMIC_CAST
// Weak ref implementation assign objects are queried for wxTrackable
// using dynamic_cast<>
// Weak ref implementation assign objects are queried for wxTrackable
// using dynamic_cast<>
-#endif // #ifdef HAVE_DYNAMIC_CAST
// Provide some basic types of weak references
// Provide some basic types of weak references
// also include in it's own registry so that these tests can be run alone
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( WeakRefTestCase, "WeakRefTestCase" );
// also include in it's own registry so that these tests can be run alone
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()
{
{
CPPUNIT_ASSERT( wreh.get() == &eh );
CPPUNIT_ASSERT( wrot.get() == &ot );
}
CPPUNIT_ASSERT( wreh.get() == &eh );
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()