1 // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -std=c++11 -fblocks -fms-extensions -fsyntax-only -verify=expected,cxx11 %s
2 // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -std=c++23 -fblocks -fms-extensions -fsyntax-only -verify=expected %s
4 template<typename T
, typename U
> struct pair
;
5 template<typename
...> struct tuple
;
7 // A parameter pack whose name appears within the pattern of a pack
8 // expansion is expanded by that pack expansion. An appearance of the
9 // name of a parameter pack is only expanded by the innermost
10 // enclosing pack expansion. The pattern of a pack expansion shall
11 // name one or more parameter packs that are not expanded by a nested
13 template<typename
... Types
>
15 typedef pair
<Types
..., int> expand_with_pacs
; // okay
16 typedef pair
<Types
, int...> expand_no_packs
; // expected-error{{pack expansion does not contain any unexpanded parameter packs}}
17 typedef pair
<pair
<Types
..., int>..., int> expand_with_expanded_nested
; // expected-error{{pack expansion does not contain any unexpanded parameter packs}}
20 // All of the parameter packs expanded by a pack expansion shall have
21 // the same number of arguments specified.
22 template<typename
...Types
>
23 struct ExpansionLengthMismatch
{
24 template<typename
...OtherTypes
>
26 typedef tuple
<pair
<Types
, OtherTypes
>...> type
; // expected-error{{pack expansion contains parameter packs 'Types' and 'OtherTypes' that have different lengths (3 vs. 2)}}
30 ExpansionLengthMismatch
<int, long>::Inner
<unsigned int, unsigned long>::type
32 tuple
<pair
<int, unsigned int>, pair
<long, unsigned long> >*il_pairs_2
= il_pairs
;
34 ExpansionLengthMismatch
<short, int, long>::Inner
<unsigned int, unsigned long>::type
// expected-note{{in instantiation of template class 'ExpansionLengthMismatch<short, int, long>::Inner<unsigned int, unsigned long>' requested here}}
38 // An appearance of a name of a parameter pack that is not expanded is
41 // Test for unexpanded parameter packs in each of the type nodes.
42 template<typename T
, int N
, typename
... Types
>
44 : public Types
, public T
// expected-error{{base type contains unexpanded parameter pack 'Types'}}
46 // BuiltinType is uninteresting
47 // FIXME: ComplexType is uninteresting?
49 typedef Types
*types_pointer
; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
52 typedef Types (^block_pointer_1
)(int); // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
53 typedef int (^block_pointer_2
)(Types
); // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
55 // LValueReferenceType
56 typedef Types
&lvalue_ref
; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
58 // RValueReferenceType
59 typedef Types
&&rvalue_ref
; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
62 typedef Types
TestPPName::* member_pointer_1
; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
63 typedef int Types::*member_pointer_2
; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
66 typedef Types constant_array
[17]; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
68 // IncompleteArrayType
69 typedef Types incomplete_array
[]; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
72 void f(int i
) { // expected-note {{declared here}}
73 Types variable_array
[i
]; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} \
74 expected
-warning
{{variable length arrays in C
++ are a Clang extension
}} \
75 expected
-note
{{function parameter
'i' with unknown value cannot be used in a constant expression
}}
78 // DependentSizedArrayType
79 typedef Types dependent_sized_array
[N
]; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
81 // DependentSizedExtVectorType
82 typedef Types dependent_sized_ext_vector
__attribute__((ext_vector_type(N
))); // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
84 // VectorType is uninteresting
87 typedef Types ext_vector
__attribute__((ext_vector_type(4))); // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
90 typedef Types (function_type_1
)(int); // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
91 typedef int (function_type_2
)(Types
); // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
93 // FunctionNoProtoType is uninteresting
94 // UnresolvedUsingType is uninteresting
95 // ParenType is uninteresting
96 // TypedefType is uninteresting
99 typedef __typeof__((static_cast<Types
>(0))) typeof_expr
; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
102 typedef __typeof__(Types
) typeof_type
; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
105 typedef decltype((static_cast<Types
>(0))) typeof_expr
; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
107 // RecordType is uninteresting
108 // EnumType is uninteresting
109 // ElaboratedType is uninteresting
111 // TemplateTypeParmType
112 typedef Types template_type_parm
; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
114 // SubstTemplateTypeParmType is uninteresting
116 // TemplateSpecializationType
117 typedef pair
<Types
, int> template_specialization
; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
119 // InjectedClassName is uninteresting.
122 typedef typename
Types::type dependent_name
; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
124 // DependentTemplateSpecializationType
125 typedef typename
Types::template apply
<int> dependent_name_1
; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
126 typedef typename
T::template apply
<Types
> dependent_name_2
; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
128 // ObjCObjectType is uninteresting
129 // ObjCInterfaceType is uninteresting
130 // ObjCObjectPointerType is uninteresting
133 // FIXME: Test for unexpanded parameter packs in each of the expression nodes.
134 template<int ...Values
>
135 void test_unexpanded_in_exprs() {
136 // PredefinedExpr is uninteresting
138 Values
; // expected-error{{expression contains unexpanded parameter pack 'Values'}}
139 // IntegerLiteral is uninteresting
140 // FloatingLiteral is uninteresting
141 // ImaginaryLiteral is uninteresting
142 // StringLiteral is uninteresting
143 // CharacterLiteral is uninteresting
144 (Values
); // expected-error{{expression contains unexpanded parameter pack 'Values'}}
146 -Values
; // expected-error{{expression contains unexpanded parameter pack 'Values'}}
151 __builtin_offsetof(OffsetMe
, array
[Values
]); // expected-error{{expression contains unexpanded parameter pack 'Values'}}
152 // FIXME: continue this...
155 template<typename
... Types
>
156 void TestPPNameFunc(int i
) {
157 f(static_cast<Types
>(i
)); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
160 template<typename T
, template<class> class ...Meta
>
161 struct TestUnexpandedTTP
{
162 typedef tuple
<typename Meta
<T
>::type
> type
; // expected-error{{declaration type contains unexpanded parameter pack 'Meta'}}
165 // Test for unexpanded parameter packs in declarations.
166 template<typename T
, typename
... Types
>
167 // FIXME: this should test that the diagnostic reads "type contains..."
168 struct alignas(Types
) TestUnexpandedDecls
: T
{ // expected-error{{expression contains unexpanded parameter pack 'Types'}}
169 void member_function(Types
); // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
170 #if __cplusplus < 201703L
171 void member_function () throw(Types
); // expected-error{{exception type contains unexpanded parameter pack 'Types'}}
173 void member_function2() noexcept(Types()); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
174 operator Types() const; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
175 Types data_member
; // expected-error{{data member type contains unexpanded parameter pack 'Types'}}
176 static Types static_data_member
; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
177 unsigned bit_field
: static_cast<Types
>(0); // expected-error{{bit-field size contains unexpanded parameter pack 'Types'}}
178 static_assert(static_cast<Types
>(0), "Boom"); // expected-error{{static assertion contains unexpanded parameter pack 'Types'}}
180 enum E0
: Types
{ // expected-error{{fixed underlying type contains unexpanded parameter pack 'Types'}}
181 EnumValue
= static_cast<Types
>(0) // expected-error{{enumerator value contains unexpanded parameter pack 'Types'}}
184 using typename
Types::type
; // expected-error{{using declaration contains unexpanded parameter pack 'Types'}}
185 using Types::value
; // expected-error{{using declaration contains unexpanded parameter pack 'Types'}}
186 using T::operator Types
; // expected-error{{using declaration contains unexpanded parameter pack 'Types'}}
188 friend class Types::foo
; // expected-error{{friend declaration contains unexpanded parameter pack 'Types'}}
189 friend void friend_func(Types
); // expected-error{{friend declaration contains unexpanded parameter pack 'Types'}}
190 friend void Types::other_friend_func(int); // expected-error{{friend declaration contains unexpanded parameter pack 'Types'}}
192 void test_initializers() {
193 T copy_init
= static_cast<Types
>(0); // expected-error{{initializer contains unexpanded parameter pack 'Types'}}
194 T
direct_init(0, static_cast<Types
>(0)); // expected-error{{initializer contains unexpanded parameter pack 'Types'}}
195 T list_init
= { static_cast<Types
>(0) }; // expected-error{{initializer contains unexpanded parameter pack 'Types'}}
198 T in_class_member_init
= static_cast<Types
>(0); // expected-error{{initializer contains unexpanded parameter pack 'Types'}}
199 TestUnexpandedDecls() :
200 Types(static_cast<Types
>(0)), // expected-error{{initializer contains unexpanded parameter pack 'Types'}}
201 Types(static_cast<Types
>(0))...,
202 in_class_member_init(static_cast<Types
>(0)) {} // expected-error{{initializer contains unexpanded parameter pack 'Types'}}
204 void default_function_args(T
= static_cast<Types
>(0)); // expected-error{{default argument contains unexpanded parameter pack 'Types'}}
206 template<typename
= Types
*> // expected-error{{default argument contains unexpanded parameter pack 'Types'}}
207 struct default_template_args_1
;
208 template<int = static_cast<Types
>(0)> // expected-error{{default argument contains unexpanded parameter pack 'Types'}}
209 struct default_template_args_2
;
210 template<template<typename
> class = Types::template apply
> // expected-error{{default argument contains unexpanded parameter pack 'Types'}}
211 struct default_template_args_3
;
213 template<Types value
> // expected-error{{non-type template parameter type contains unexpanded parameter pack 'Types'}}
214 struct non_type_template_param_type
;
216 void decls_in_stmts() {
217 Types t
; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
218 for (Types
*t
= 0; ; ) { } // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
219 for (; Types
*t
= 0; ) { } // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
220 T a
[] = { T(), T(), T() };
221 for (Types t
: a
) { } // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
222 switch(Types
*t
= 0) { } // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
223 while(Types
*t
= 0) { } // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
224 if (Types
*t
= 0) { } // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
226 } catch (Types
*) { // expected-error{{exception type contains unexpanded parameter pack 'Types'}}
231 // FIXME: Test for unexpanded parameter packs in each of the statements.
234 template<typename
...Types
>
242 typedef struct _GUID
{
244 unsigned short Data2
;
245 unsigned short Data3
;
246 unsigned char Data4
[ 8 ];
249 template<typename T
, typename
...Types
>
250 void test_unexpanded_exprs(Types
...values
) {
251 // CXXOperatorCallExpr
252 (void)(values
+ 0); // expected-error{{expression contains unexpanded parameter pack 'values'}}
253 (void)(0 + values
); // expected-error{{expression contains unexpanded parameter pack 'values'}}
256 values
.f(); // expected-error{{expression contains unexpanded parameter pack 'values'}}
258 x
.f(values
); // expected-error{{expression contains unexpanded parameter pack 'values'}}
259 x
.Types::f(); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
260 x
.f
<Types
>(); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
263 (void)static_cast<Types
&>(values
); // expected-error{{expression contains unexpanded parameter packs 'Types' and 'values'}}
265 // CXXDynamicCastExpr
266 (void)dynamic_cast<Types
&>(values
); // expected-error{{expression contains unexpanded parameter packs 'Types' and 'values'}}
268 // CXXReinterpretCastExpr
269 (void)reinterpret_cast<Types
&>(values
); // expected-error{{expression contains unexpanded parameter packs 'Types' and 'values'}}
272 (void)const_cast<Types
&>(values
); // expected-error{{expression contains unexpanded parameter packs 'Types' and 'values'}}
275 (void)typeid(Types
); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
276 (void)typeid(values
); // expected-error{{expression contains unexpanded parameter pack 'values'}}
279 (void)__uuidof(Types
); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
280 (void)__uuidof(values
); // expected-error{{expression contains unexpanded parameter pack 'values'}}
282 // CXXThisExpr is uninteresting
285 throw Types(); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
286 throw values
; // expected-error{{expression contains unexpanded parameter pack 'values'}}
288 // CXXDefaultArgExpr is uninteresting
290 // CXXBindTemporaryExpr is uninteresting
292 // CXXConstructExpr is uninteresting
294 // CXXFunctionalCastExpr
295 (void)Types(); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
297 // CXXTemporaryObjectExpr
298 (void)X(values
); // expected-error{{expression contains unexpanded parameter pack 'values'}}
300 // CXXScalarValueInitExpr is uninteresting
303 (void)new Types
; // expected-error{{expression contains unexpanded parameter pack 'Types'}}
304 (void)new X(values
); // expected-error{{expression contains unexpanded parameter pack 'values'}}
305 (void)new (values
) X(values
); // expected-error{{expression contains unexpanded parameter pack 'values'}}
306 (void)new X
[values
]; // expected-error{{expression contains unexpanded parameter pack 'values'}}
309 delete values
; // expected-error{{expression contains unexpanded parameter pack 'values'}}
310 delete [] values
; // expected-error{{expression contains unexpanded parameter pack 'values'}}
312 // CXXPseudoDestructorExpr
314 values
.~T(); // expected-error{{expression contains unexpanded parameter pack 'values'}}
315 t
.~Types(); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
316 t
.Types::~T(); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
318 // Unary TypeTraitExpr
319 __is_pod(Types
); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
321 // Binary TypeTraitExpr
322 __is_base_of(Types
, T
); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
323 __is_base_of(T
, Types
); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
325 // UnresolvedLookupExpr
326 test_unexpanded_exprs(values
); // expected-error{{expression contains unexpanded parameter pack 'values'}}
327 test_unexpanded_exprs
<Types
>(); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
329 // DependentScopeDeclRefExpr
330 Types::test_unexpanded_exprs(); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
331 T::template test_unexpanded_exprs
<Types
>(); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
333 // CXXUnresolvedConstructExpr
334 Types(5); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
336 // CXXDependentScopeMemberExpr
337 values
.foo(); // expected-error{{expression contains unexpanded parameter pack 'values'}}
338 t
.foo(values
); // expected-error{{expression contains unexpanded parameter pack 'values'}}
340 // FIXME: There's an evil ambiguity here, because we don't know if
341 // Types refers to the template type parameter pack in scope or a
345 t
.template foo
<Types
>(); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
347 // UnresolvedMemberExpr
348 x
.f
<Types
>(); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
349 x
.f(values
); // expected-error{{expression contains unexpanded parameter pack 'values'}}
352 noexcept(values
); // expected-error{{expression contains unexpanded parameter pack 'values'}}
354 // PackExpansionExpr is uninteresting
355 // SizeOfPackExpr is uninteresting
357 // FIXME: Objective-C expressions will need to go elsewhere
359 for (auto t
: values
) { } // expected-error{{expression contains unexpanded parameter pack 'values'}}
361 switch (values
) { } // expected-error{{expression contains unexpanded parameter pack 'values'}}
362 switch (0) { case 0: case values
: ; } // expected-error{{expression contains unexpanded parameter pack 'values'}}
364 do { } while (values
); // expected-error{{expression contains unexpanded parameter pack 'values'}}
367 goto *values
; // expected-error{{expression contains unexpanded parameter pack 'values'}}
369 void f(int arg
= values
); // expected-error{{default argument contains unexpanded parameter pack 'values'}}
372 // Test unexpanded parameter packs in partial/explicit specializations.
373 namespace Specializations
{
374 template<typename T
, typename
... Ts
>
376 template<typename
... Ts
>
377 struct PrimaryClass
<Ts
>; // expected-error{{partial specialization contains unexpanded parameter pack 'Ts'}}
379 template<typename T
, typename
... Ts
>
380 void PrimaryFunction();
381 template<typename T
, typename
... Ts
>
382 void PrimaryFunction
<Ts
>(); // expected-error{{function template partial specialization is not allowed}}
384 #if __cplusplus >= 201402L
385 template<typename T
, typename
... Ts
>
386 constexpr int PrimaryVar
= 0;
387 template<typename
... Ts
>
388 constexpr int PrimaryVar
<Ts
> = 0; // expected-error{{partial specialization contains unexpanded parameter pack 'Ts'}}
391 template<typename
... Ts
>
393 template<typename
... Us
>
396 struct InnerClass
<Ts
>; // expected-error{{explicit specialization contains unexpanded parameter pack 'Ts'}}
398 struct InnerClass
<U
, Ts
>; // expected-error{{partial specialization contains unexpanded parameter pack 'Ts'}}
400 template<typename
... Us
>
401 void InnerFunction();
403 void InnerFunction
<Ts
>(); // expected-error{{explicit specialization contains unexpanded parameter pack 'Ts'}}
405 friend void PrimaryFunction
<Ts
>(); // expected-error{{friend declaration contains unexpanded parameter pack 'Ts'}}
407 #if __cplusplus >= 201402L
408 template<typename
... Us
>
409 constexpr static int InnerVar
= 0;
411 constexpr int InnerVar
<Ts
> = 0; // expected-error{{explicit specialization contains unexpanded parameter pack 'Ts'}}
413 constexpr static int InnerVar
<U
, Ts
> = 0; // expected-error{{partial specialization contains unexpanded parameter pack 'Ts'}}
418 // Test for diagnostics in the presence of multiple unexpanded
420 template<typename T
, typename U
> struct pair
;
422 template<typename
...OuterTypes
>
423 struct MemberTemplatePPNames
{
424 template<typename
...InnerTypes
>
426 typedef pair
<OuterTypes
, InnerTypes
>* types
; // expected-error{{declaration type contains unexpanded parameter packs 'OuterTypes' and 'InnerTypes'}}
428 template<typename
...VeryInnerTypes
>
430 typedef pair
<pair
<VeryInnerTypes
, OuterTypes
>, pair
<InnerTypes
, OuterTypes
> > types
; // expected-error{{declaration type contains unexpanded parameter packs 'VeryInnerTypes', 'OuterTypes', ...}}
435 // Example from working paper
436 namespace WorkingPaperExample
{
437 template<typename
...> struct Tuple
{};
438 template<typename T1
, typename T2
> struct Pair
{};
440 template<class ... Args1
> struct zip
{
441 template<class ... Args2
> struct with
{
442 typedef Tuple
<Pair
<Args1
, Args2
> ... > type
; // expected-error{{pack expansion contains parameter packs 'Args1' and 'Args2' that have different lengths (1 vs. 2)}}
446 typedef zip
<short, int>::with
<unsigned short, unsigned>::type T1
; // T1 is Tuple<Pair<short, unsigned short>, Pair<int, unsigned>>
447 typedef Tuple
<Pair
<short, unsigned short>, Pair
<int, unsigned>> T1
;
449 typedef zip
<short>::with
<unsigned short, unsigned>::type T2
; // expected-note{{in instantiation of template class}}
451 template<class ... Args
> void f(Args
...);
452 template<class ... Args
> void h(Args
...);
454 template<class ... Args
>
455 void g(Args
... args
) {
456 f(const_cast<const Args
*>(&args
)...); // OK: "Args" and "args" are expanded within f
457 f(5 ...); // expected-error{{pack expansion does not contain any unexpanded parameter packs}}
458 f(args
); // expected-error{{expression contains unexpanded parameter pack 'args'}}
459 f(h(args
...) + args
...);
464 template<int> struct A
{ A(int); };
465 template<int...N
> struct B
{
466 template<int...M
> struct C
: A
<N
>... {
467 C() : A
<N
>(M
)... {} // expected-error{{pack expansion contains parameter packs 'N' and 'M' that have different lengths (2 vs. 3)}} expected-error{{pack expansion contains parameter packs 'N' and 'M' that have different lengths (4 vs. 3)}}
470 B
<1,2>::C
<4,5,6> c1
; // expected-note{{in instantiation of}}
471 B
<1,2,3,4>::C
<4,5,6> c2
; // expected-note{{in instantiation of}}
475 template<int> using T
= int;
476 template<typename
> struct S
{ static const int value
= 0; };
477 template<typename
> const int vt
= 0; // cxx11-warning {{extension}}
479 template<int ...Ns
> void g() {
481 f(S
<T
<Ns
>>::value
...);
485 template void g
<1, 2, 3>();
488 template <class... Ts
>
489 int var_expr(Ts
... ts
);
491 template <class... Ts
>
492 auto a_function(Ts
... ts
) -> decltype(var_expr(ts
...));
495 using partial
= decltype(a_function
<int, T
>);
497 int use_partial() { partial
<char> n
; }
502 template <class... Ts
>
503 using FooAlias
= Foo
<void(Ts
...)>;
505 template <class... Ts
>
506 using FooAliasAlias
= FooAlias
<Ts
..., Ts
...>;
508 template <class... Ts
>
509 void bar(const FooAlias
<Ts
...> &) {}
521 template <typename
... As
> struct A
{
522 template <typename
... Bs
> using B
= void(As
...(Bs
));
525 template <typename
... Cs
> struct C
{
526 template <typename
... Ds
> using D
= typename A
<Cs
...>::template B
<Ds
...>;
529 using t1
= C
<int, int>::template D
<float, float>;
531 template <typename A
, typename B
>
532 using ConditionalRewrite
= B
;
534 template <typename T
>
535 using SignatureType
= int;
537 template <typename
... Args
>
539 template <typename
... Params
>
540 using Return
= SignatureType
<int(ConditionalRewrite
<Args
, Params
>...)>;
544 template <typename
... Args
>
546 using T1
= Type1
<Args
...>;
548 template <typename
... Params
>
549 using Return
= typename
T1::template Return
<Params
...>;
553 template <typename T
>
554 typename
T::template Return
<int, int> InvokeMethod() {
559 return InvokeMethod
<Type2
<int, int>>();