diff --git a/tests/Makefile.in b/tests/Makefile.in
index 3ac2885e14..f5c1b47c29 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -628,6 +628,23 @@ printfbench_printfbench.o: $(srcdir)/benchmarks/printfbench.cpp $(PRINTFBENCH_OD
@COND_USE_STC_1@monolib_stc.o monodll_stc.o stcdll_stc.o stclib_stc.o: \
@COND_USE_STC_1@ $(srcdir)/include/wx/stc/stc.h
+# notice the ugly hack with using CXXWARNINGS: we can't use CPPFLAGS as
+# currently the value in the makefile would be ignored if we did, but
+# warnings don't matter when we expect compilation to fail anyhow so we can
+# use this variable to enable the compilation of code which is supposed to
+# fail
+failtest:
+ @$(RM) test_evthandler.o
+ @for d in GLOBAL STATIC METHOD FUNCTOR DERIVED WRONG_CLASS; do \
+ if $(MAKE) CXXWARNINGS=-DTEST_INVALID_BIND_$$d test_evthandler.o 2>/dev/null; then \
+ echo "*** Compilation with TEST_INVALID_BIND_$$d unexpectedly succeeded.">&2; \
+ exit 1; \
+ fi; \
+ done; \
+ exit 0
+
+.PHONY: failtest
+
# Include dependency info, if present:
@IF_GNU_MAKE@-include ./.deps/*.d
diff --git a/tests/events/evthandler.cpp b/tests/events/evthandler.cpp
index 031a0658da..309b34442f 100644
--- a/tests/events/evthandler.cpp
+++ b/tests/events/evthandler.cpp
@@ -366,20 +366,35 @@ void EvtHandlerTestCase::InvalidBind()
// automatically, you need to uncomment them manually and test that
// compilation does indeed fail
- //handler.Bind(MyEventType, GlobalOnAnotherEvent);
- //IdleFunctor f; handler.Bind(MyEventType, f);
- //handler.Bind(MyEventType, &MyHandler::StaticOnAnotherEvent);
- //handler.Bind(MyEventType, &MyHandler::OnAnotherEvent, &handler);
+ // connecting a handler with incompatible signature shouldn't work
+#ifdef TEST_INVALID_BIND_GLOBAL
+ handler.Bind(MyEventType, GlobalOnAnotherEvent);
+#endif
+#ifdef TEST_INVALID_BIND_STATIC
+ handler.Bind(MyEventType, &MyHandler::StaticOnAnotherEvent);
+#endif
+#ifdef TEST_INVALID_BIND_METHOD
+ handler.Bind(MyEventType, &MyHandler::OnAnotherEvent, &handler);
+#endif
+#ifdef TEST_INVALID_BIND_FUNCTOR
+ IdleFunctor f;
+ handler.Bind(MyEventType, f);
+#endif
- // Test that this sample (discussed on the mailing list) doesn't compile:
- // >struct C1 : wxEvtHandler { };
- // >struct C2 : wxEvtHandler { void OnWhatever(wxEvent&) };
- // >C1 c1;
- // >c1.Connect(&C2::OnWhatever); // BOOM
+ // calling a derived class method with a base class pointer must not work
+#ifdef TEST_INVALID_BIND_DERIVED
+ struct C1 : wxEvtHandler { };
+ struct C2 : wxEvtHandler { void OnWhatever(wxEvent&); };
+ C1 c1;
+ c1.Bind(&C2::OnWhatever);
+#endif
- //MySink mySink;
- //MyHandler myHandler;
- //myHandler.Bind( MyEventType, &MyHandler::OnMyEvent, &mySink );
+ // using object pointer incompatible with the method must not work
+#ifdef TEST_INVALID_BIND_WRONG_CLASS
+ MySink mySink;
+ MyHandler myHandler;
+ myHandler.Bind(MyEventType, &MyHandler::OnMyEvent, &mySink);
+#endif
}
#endif // !wxEVENTS_COMPATIBILITY_2_8
diff --git a/tests/test.bkl b/tests/test.bkl
index 31507cdf56..b78a570a0c 100644
--- a/tests/test.bkl
+++ b/tests/test.bkl
@@ -168,5 +168,23 @@
base
+
+# notice the ugly hack with using CXXWARNINGS: we can't use CPPFLAGS as
+# currently the value in the makefile would be ignored if we did, but
+# warnings don't matter when we expect compilation to fail anyhow so we can
+# use this variable to enable the compilation of code which is supposed to
+# fail
+failtest:
+ @$(RM) test_evthandler.o
+ @for d in GLOBAL STATIC METHOD FUNCTOR DERIVED WRONG_CLASS; do \
+ if $(MAKE) CXXWARNINGS=-DTEST_INVALID_BIND_$$d test_evthandler.o 2>/dev/null; then \
+ echo "*** Compilation with TEST_INVALID_BIND_$$d unexpectedly succeeded.">&2; \
+ exit 1; \
+ fi; \
+ done; \
+ exit 0
+
+.PHONY: failtest
+