@@ -1684,6 +1684,45 @@ TEST(FunctionReflectionTest, GetFunctionCallWrapper) {
1684
1684
bool boolean = false ;
1685
1685
FCI_op.Invoke ((void *)&boolean, {args, /* args_size=*/ 1 }, object);
1686
1686
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 );
1687
1726
}
1688
1727
1689
1728
TEST (FunctionReflectionTest, IsConstMethod) {
0 commit comments