@@ -1684,6 +1684,45 @@ TEST(FunctionReflectionTest, GetFunctionCallWrapper) {
16841684 bool boolean = false ;
16851685 FCI_op.Invoke ((void *)&boolean, {args, /* args_size=*/ 1 }, object);
16861686 EXPECT_TRUE (boolean);
1687+
1688+ Interp->process (R"(
1689+ namespace N1 {
1690+
1691+ template <typename... _Tn> struct Klass3 {
1692+ using type = int;
1693+ };
1694+
1695+ namespace N2 {
1696+ template <typename T1, typename T2> class Klass1 {};
1697+
1698+ template <typename T1, typename T2> class Klass2 {};
1699+
1700+ template <typename T1, typename T2, typename T3, typename T4>
1701+ constexpr Klass2<
1702+ T1, typename Klass3<T2, Klass1<T3, T4>>::type>
1703+ operator+(const Klass2<T1, T2> &__lhs,
1704+ const Klass1<T3, T4> &__rhs) {
1705+ typedef Klass1<T3, T4> __T1;
1706+ typedef typename Klass3<T2, __T1>::type __ct;
1707+ typedef Klass2<T1, __ct> __T2;
1708+ return {};
1709+ }
1710+ } // namespace N2
1711+ } // namespace N1
1712+
1713+ N1::N2::Klass2<int, double> K1;
1714+ N1::N2::Klass1<char, float> K2;
1715+ )" );
1716+
1717+ Cpp::TCppType_t K1 = Cpp::GetTypeFromScope (Cpp::GetNamed (" K1" ));
1718+ Cpp::TCppType_t K2 = Cpp::GetTypeFromScope (Cpp::GetNamed (" K2" ));
1719+ operators.clear ();
1720+ Cpp::GetOperator (Cpp::GetScope (" N2" , Cpp::GetScope (" N1" )), Cpp::OP_Plus, operators);
1721+ EXPECT_EQ (operators.size (), 1 );
1722+ Cpp::TCppFunction_t kop =
1723+ Cpp::BestOverloadFunctionMatch (operators, {}, {K1, K2});
1724+ auto chrono_op_fn_callable = Cpp::MakeFunctionCallable (kop);
1725+ EXPECT_EQ (chrono_op_fn_callable.getKind (), Cpp::JitCall::kGenericCall );
16871726}
16881727
16891728TEST (FunctionReflectionTest, IsConstMethod) {
0 commit comments