diff options
author | William S Fulton <wsf@fultondesigns.co.uk> | 2023-01-03 21:26:12 +0000 |
---|---|---|
committer | William S Fulton <wsf@fultondesigns.co.uk> | 2023-01-03 21:26:12 +0000 |
commit | cdc08c9325621587038a4e8f582c3adcfe5225e0 (patch) | |
tree | 258b70e1eec9fbb688b98b902e488476097de1ae /Examples | |
parent | 20ff64217d4b4cd2bc3d07c276c1334cf9b415a8 (diff) | |
download | swig-cdc08c9325621587038a4e8f582c3adcfe5225e0.tar.gz |
Move variadic function template tests to separate testcase
Diffstat (limited to 'Examples')
-rw-r--r-- | Examples/test-suite/common.mk | 1 | ||||
-rw-r--r-- | Examples/test-suite/cpp11_variadic_function_templates.i | 82 | ||||
-rw-r--r-- | Examples/test-suite/cpp11_variadic_templates.i | 43 |
3 files changed, 83 insertions, 43 deletions
diff --git a/Examples/test-suite/common.mk b/Examples/test-suite/common.mk index cb71aab1b..b1f032641 100644 --- a/Examples/test-suite/common.mk +++ b/Examples/test-suite/common.mk @@ -632,6 +632,7 @@ CPP11_TEST_CASES += \ cpp11_uniform_initialization \ cpp11_unrestricted_unions \ cpp11_userdefined_literals \ + cpp11_variadic_function_templates \ cpp11_variadic_templates \ # Broken C++11 test cases. diff --git a/Examples/test-suite/cpp11_variadic_function_templates.i b/Examples/test-suite/cpp11_variadic_function_templates.i new file mode 100644 index 000000000..f95c57a1a --- /dev/null +++ b/Examples/test-suite/cpp11_variadic_function_templates.i @@ -0,0 +1,82 @@ +%module cpp11_variadic_function_templates + +// Some tests for variadic function templates +%inline %{ +class A { +public: + A() { + a = 100; + } + virtual ~A() {} + int a; +}; + +class B { +public: + B() { + b = 200; + } + virtual ~B() {} + int b; +}; + +class C { +public: + C() { + c = 300; + } + virtual ~C() {} + int c; +}; + +class D { +public: + D() { + d = 400; + } + virtual ~D() {} + int d; +}; +%} + +// #1863 +%inline %{ +class Container { +public: +template<typename... Args> + static void notifyMyTypes(void (fn)(Args...)); // unconventional function (ptr) +template<typename... Args> + static void notifyMyTypesA(void (*fn)(Args...)) {} // conventional function ptr +template<typename... Args> + static void notifyMyTypesB(void fn(Args...)) {}; // unconventional function (ptr) +}; +%} +%{ +template<typename... Args> + void Container::notifyMyTypes(void (fn)(Args...)) {} + +// Explicit template instantiations +template void Container::notifyMyTypes<>(void (tt)()); +template void Container::notifyMyTypes<int>(void (tt)(int)); +template void Container::notifyMyTypes<int, double>(void (tt)(int, double)); +%} + +// Not supported (most vexing parse), see Extending.html#Extending_nn7 +//%template(ContainerNotifyMyTypes1) Container::notifyMyTypes<int>; +%template(ContainerNotifyMyTypesA1) Container::notifyMyTypesA<int>; +%template(ContainerNotifyMyTypesB1) Container::notifyMyTypesB<int>; + +// #1863 +%inline %{ +#include <type_traits> +class EmplaceContainer { +public: +template<typename T, typename... Args> +void emplace(Args &&... args) noexcept( + std::is_nothrow_constructible<T, Args &&...>::value) {} +}; +%} + +%template(emplace) EmplaceContainer::emplace<int,A>; +// TODO +//%template(emplace) EmplaceContainer::emplace<int,A,B,C>; diff --git a/Examples/test-suite/cpp11_variadic_templates.i b/Examples/test-suite/cpp11_variadic_templates.i index 008539393..1caf82463 100644 --- a/Examples/test-suite/cpp11_variadic_templates.i +++ b/Examples/test-suite/cpp11_variadic_templates.i @@ -218,46 +218,3 @@ public: %template(FixedAndVariadicParms1) FixedAndVariadicParms<A>; %template(FixedAndVariadicParms2) FixedAndVariadicParms<A,B>; %template(FixedAndVariadicParms3) FixedAndVariadicParms<A,B,C>; - - -// #1863 -%inline %{ -class Container { -public: -template<typename... Args> - static void notifyMyTypes(void (fn)(Args...)); // unconventional function (ptr) -template<typename... Args> - static void notifyMyTypesA(void (*fn)(Args...)) {} // conventional function ptr -template<typename... Args> - static void notifyMyTypesB(void fn(Args...)) {}; // unconventional function (ptr) -}; -%} -%{ -template<typename... Args> - void Container::notifyMyTypes(void (fn)(Args...)) {} - -// Explicit template instantiations -template void Container::notifyMyTypes<>(void (tt)()); -template void Container::notifyMyTypes<int>(void (tt)(int)); -template void Container::notifyMyTypes<int, double>(void (tt)(int, double)); -%} - -// Not supported (most vexing parse), see Extending.html#Extending_nn7 -//%template(ContainerNotifyMyTypes1) Container::notifyMyTypes<int>; -%template(ContainerNotifyMyTypesA1) Container::notifyMyTypesA<int>; -%template(ContainerNotifyMyTypesB1) Container::notifyMyTypesB<int>; - -// #1863 -%inline %{ -#include <type_traits> -class EmplaceContainer { -public: -template<typename T, typename... Args> -void emplace(Args &&... args) noexcept( - std::is_nothrow_constructible<T, Args &&...>::value) {} -}; -%} - -%template(emplace) EmplaceContainer::emplace<int,A>; -// TODO -//%template(emplace) EmplaceContainer::emplace<int,A,B,C>; |