mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	TemplateTests: fix compilation with ICC
ICC in some cases fails on trailing return type with decltype Closes #1748
This commit is contained in:
		| @@ -102,35 +102,49 @@ | ||||
|     template<typename...> struct TypeList {};\ | ||||
|     template<typename...Ts>\ | ||||
|     constexpr auto get_wrapper() noexcept -> TypeList<Ts...> { return {}; }\ | ||||
|     template<template<typename...> class...> struct TemplateTypeList{};\ | ||||
|     template<template<typename...> class...Cs>\ | ||||
|     constexpr auto get_wrapper() noexcept -> TemplateTypeList<Cs...> { return {}; }\ | ||||
|     template<typename...>\ | ||||
|     struct append;\ | ||||
|     template<typename...>\ | ||||
|     struct rewrap;\ | ||||
|     template<template<typename...> class, typename...>\ | ||||
|     struct create;\ | ||||
|     template<template<typename...> class, typename>\ | ||||
|     struct convert;\ | ||||
|     \ | ||||
|     template<template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2> \ | ||||
|     constexpr auto append(L1<E1...>, L2<E2...>) noexcept -> L1<E1...,E2...> { return {}; }\ | ||||
|     template<typename T> \ | ||||
|     struct append<T> { using type = T; };\ | ||||
|     template< template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2, typename...Rest>\ | ||||
|     constexpr auto append(L1<E1...>, L2<E2...>, Rest...) noexcept -> decltype(append(L1<E1...,E2...>{}, Rest{}...)) { return {}; }\ | ||||
|     struct append<L1<E1...>, L2<E2...>, Rest...> { using type = typename append<L1<E1...,E2...>, Rest...>::type; };\ | ||||
|     template< template<typename...> class L1, typename...E1, typename...Rest>\ | ||||
|     constexpr auto append(L1<E1...>, TypeList<mpl_::na>, Rest...) noexcept -> L1<E1...> { return {}; }\ | ||||
|     struct append<L1<E1...>, TypeList<mpl_::na>, Rest...> { using type = L1<E1...>; };\ | ||||
|     \ | ||||
|     template< template<typename...> class Container, template<typename...> class List, typename...elems>\ | ||||
|     constexpr auto rewrap(List<elems...>) noexcept -> TypeList<Container<elems...>> { return {}; }\ | ||||
|     struct rewrap<TemplateTypeList<Container>, List<elems...>> { using type = TypeList<Container<elems...>>; };\ | ||||
|     template< template<typename...> class Container, template<typename...> class List, class...Elems, typename...Elements>\ | ||||
|     constexpr auto rewrap(List<Elems...>,Elements...) noexcept -> decltype(append(TypeList<Container<Elems...>>{}, rewrap<Container>(Elements{}...))) { return {}; }\ | ||||
|     struct rewrap<TemplateTypeList<Container>, List<Elems...>, Elements...> { using type = typename append<TypeList<Container<Elems...>>, typename rewrap<TemplateTypeList<Container>, Elements...>::type>::type; };\ | ||||
|     \ | ||||
|     template<template <typename...> class Final, template< typename...> class...Containers, typename...Types>\ | ||||
|     constexpr auto create(TypeList<Types...>) noexcept -> decltype(append(Final<>{}, rewrap<Containers>(Types{}...)...)) { return {}; }\ | ||||
|     struct create<Final, TemplateTypeList<Containers...>, TypeList<Types...>> { using type = typename append<Final<>, typename rewrap<TemplateTypeList<Containers>, Types...>::type...>::type; };\ | ||||
|     template<template <typename...> class Final, template <typename...> class List, typename...Ts>\ | ||||
|     constexpr auto convert(const List<Ts...>& ) noexcept -> decltype(append(Final<>{},TypeList<Ts>{}...)) { return {}; } | ||||
|     struct convert<Final, List<Ts...>> { using type = typename append<Final<>,TypeList<Ts>...>::type; }; | ||||
|  | ||||
| #define INTERNAL_CATCH_NTTP_1(signature, ...)\ | ||||
|     template<INTERNAL_CATCH_REMOVE_PARENS(signature)> struct Nttp{};\ | ||||
|     template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ | ||||
|     constexpr auto get_wrapper() noexcept -> Nttp<__VA_ARGS__> { return {}; } \ | ||||
|     template<template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...> struct NttpTemplateTypeList{};\ | ||||
|     template<template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Cs>\ | ||||
|     constexpr auto get_wrapper() noexcept -> NttpTemplateTypeList<Cs...> { return {}; } \ | ||||
|     \ | ||||
|     template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature)>\ | ||||
|     constexpr auto rewrap(List<__VA_ARGS__>) noexcept -> TypeList<Container<__VA_ARGS__>> { return {}; }\ | ||||
|     struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>> { using type = TypeList<Container<__VA_ARGS__>>; };\ | ||||
|     template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature), typename...Elements>\ | ||||
|     constexpr auto rewrap(List<__VA_ARGS__>,Elements...elems) noexcept -> decltype(append(TypeList<Container<__VA_ARGS__>>{}, rewrap<Container>(elems...))) { return {}; }\ | ||||
|     struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>, Elements...> { using type = typename append<TypeList<Container<__VA_ARGS__>>, typename rewrap<NttpTemplateTypeList<Container>, Elements...>::type>::type; };\ | ||||
|     template<template <typename...> class Final, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Containers, typename...Types>\ | ||||
|     constexpr auto create(TypeList<Types...>) noexcept -> decltype(append(Final<>{}, rewrap<Containers>(Types{}...)...)) { return {}; } | ||||
|     struct create<Final, NttpTemplateTypeList<Containers...>, TypeList<Types...>> { using type = typename append<Final<>, typename rewrap<NttpTemplateTypeList<Containers>, Types...>::type...>::type; }; | ||||
|  | ||||
| #define INTERNAL_CATCH_DECLARE_SIG_TEST0(TestName) | ||||
| #define INTERNAL_CATCH_DECLARE_SIG_TEST1(TestName, signature)\ | ||||
|   | ||||
| @@ -203,7 +203,7 @@ struct AutoReg : NonCopyable { | ||||
|                 }                                                     \ | ||||
|             };                                                        \ | ||||
|             static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \ | ||||
|                 using TestInit = decltype(create<TestName, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>(TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>{})); \ | ||||
|                 using TestInit = typename create<TestName, decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()), TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type; \ | ||||
|                 TestInit t;                                           \ | ||||
|                 t.reg_tests();                                        \ | ||||
|                 return 0;                                             \ | ||||
| @@ -246,7 +246,7 @@ struct AutoReg : NonCopyable { | ||||
|             }                                                     \ | ||||
|         };\ | ||||
|         static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \ | ||||
|                 using TestInit = decltype(convert<TestName>(std::declval<TmplList>())); \ | ||||
|                 using TestInit = typename convert<TestName, TmplList>::type; \ | ||||
|                 TestInit t;                                           \ | ||||
|                 t.reg_tests();                                        \ | ||||
|                 return 0;                                             \ | ||||
| @@ -327,7 +327,7 @@ struct AutoReg : NonCopyable { | ||||
|                 }\ | ||||
|             };\ | ||||
|             static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ | ||||
|                 using TestInit = decltype(create<TestNameClass, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>(TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>{}));\ | ||||
|                 using TestInit = typename create<TestNameClass, decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()), TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type;\ | ||||
|                 TestInit t;\ | ||||
|                 t.reg_tests();\ | ||||
|                 return 0;\ | ||||
| @@ -373,7 +373,7 @@ struct AutoReg : NonCopyable { | ||||
|                 }\ | ||||
|             };\ | ||||
|             static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ | ||||
|                 using TestInit = decltype(convert<TestNameClass>(std::declval<TmplList>()));\ | ||||
|                 using TestInit = typename convert<TestNameClass, TmplList>::type;\ | ||||
|                 TestInit t;\ | ||||
|                 t.reg_tests();\ | ||||
|                 return 0;\ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Jozef Grajciar
					Jozef Grajciar