diff --git a/Examples/test-suite/common.mk b/Examples/test-suite/common.mk index 83f420a8a..d75d3242e 100644 --- a/Examples/test-suite/common.mk +++ b/Examples/test-suite/common.mk @@ -183,6 +183,7 @@ CPP_TEST_CASES += \ director_enum \ director_exception \ director_exception_catches \ + director_exception_nothrow \ director_extend \ director_finalizer \ director_frob \ diff --git a/Examples/test-suite/director_exception.i b/Examples/test-suite/director_exception.i index 8c2ccc61b..71366bef0 100644 --- a/Examples/test-suite/director_exception.i +++ b/Examples/test-suite/director_exception.i @@ -118,9 +118,9 @@ Foo *launder(Foo *f) { %{ // throw is deprecated in C++11 and invalid in C++17 and later #if defined(__cplusplus) && __cplusplus >= 201103L -#define throw(TYPES...) +#define throw(TYPE1, TYPE2, TYPE3) #else -#define throw(TYPES...) throw(TYPES) +#define throw(TYPE1, TYPE2, TYPE3) throw(TYPE1, TYPE2, TYPE3) #if defined(_MSC_VER) #pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow) #endif @@ -139,16 +139,15 @@ Foo *launder(Foo *f) { class Base { public: - virtual ~Base() throw() {} + virtual ~Base() {} }; class Bar : public Base { public: - virtual std::string ping() throw(Exception1, Exception2&) { return "Bar::ping()"; } + virtual std::string ping() throw(Exception1, Exception2&, double) { return "Bar::ping()"; } virtual std::string pong() throw(Unknown1, int, Unknown2&) { return "Bar::pong();" + ping(); } - virtual std::string pang() throw() { return "Bar::pang()"; } }; // Class to allow regression testing SWIG/PHP not checking if an exception diff --git a/Examples/test-suite/director_exception_nothrow.i b/Examples/test-suite/director_exception_nothrow.i new file mode 100644 index 000000000..8a072617f --- /dev/null +++ b/Examples/test-suite/director_exception_nothrow.i @@ -0,0 +1,28 @@ +%module(directors="1") director_exception_nothrow + +%include "std_string.i" + +%feature("director") Bar; + +%{ +#if defined(_MSC_VER) + #pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow) +#endif +%} + +%inline %{ +#include + +class Base +{ +public: + virtual ~Base() throw() {} +}; + + +class Bar : public Base +{ +public: + virtual std::string pang() throw() { return "Bar::pang()"; } +}; +%} diff --git a/Examples/test-suite/php/director_exception_runme.php b/Examples/test-suite/php/director_exception_runme.php index 8b852c2ce..47f645b07 100644 --- a/Examples/test-suite/php/director_exception_runme.php +++ b/Examples/test-suite/php/director_exception_runme.php @@ -4,7 +4,7 @@ require "tests.php"; require "director_exception.php"; // No new functions -check::functions(array(foo_ping,foo_pong,launder,bar_ping,bar_pong,bar_pang,returnalltypes_return_int,returnalltypes_return_double,returnalltypes_return_const_char_star,returnalltypes_return_std_string,returnalltypes_return_bar,returnalltypes_call_int,returnalltypes_call_double,returnalltypes_call_const_char_star,returnalltypes_call_std_string,returnalltypes_call_bar,is_python_builtin)); +check::functions(array(foo_ping,foo_pong,launder,bar_ping,bar_pong,returnalltypes_return_int,returnalltypes_return_double,returnalltypes_return_const_char_star,returnalltypes_return_std_string,returnalltypes_return_bar,returnalltypes_call_int,returnalltypes_call_double,returnalltypes_call_const_char_star,returnalltypes_call_std_string,returnalltypes_call_bar,is_python_builtin)); // No new classes check::classes(array(director_exception,Foo,Exception1,Exception2,Base,Bar,ReturnAllTypes)); // now new vars diff --git a/Examples/test-suite/php5/director_exception_runme.php b/Examples/test-suite/php5/director_exception_runme.php index 8b852c2ce..47f645b07 100644 --- a/Examples/test-suite/php5/director_exception_runme.php +++ b/Examples/test-suite/php5/director_exception_runme.php @@ -4,7 +4,7 @@ require "tests.php"; require "director_exception.php"; // No new functions -check::functions(array(foo_ping,foo_pong,launder,bar_ping,bar_pong,bar_pang,returnalltypes_return_int,returnalltypes_return_double,returnalltypes_return_const_char_star,returnalltypes_return_std_string,returnalltypes_return_bar,returnalltypes_call_int,returnalltypes_call_double,returnalltypes_call_const_char_star,returnalltypes_call_std_string,returnalltypes_call_bar,is_python_builtin)); +check::functions(array(foo_ping,foo_pong,launder,bar_ping,bar_pong,returnalltypes_return_int,returnalltypes_return_double,returnalltypes_return_const_char_star,returnalltypes_return_std_string,returnalltypes_return_bar,returnalltypes_call_int,returnalltypes_call_double,returnalltypes_call_const_char_star,returnalltypes_call_std_string,returnalltypes_call_bar,is_python_builtin)); // No new classes check::classes(array(director_exception,Foo,Exception1,Exception2,Base,Bar,ReturnAllTypes)); // now new vars