diff --git a/lib/Interpreter/CppInterOp.cpp b/lib/Interpreter/CppInterOp.cpp index d1aeb7b52..f5718be54 100644 --- a/lib/Interpreter/CppInterOp.cpp +++ b/lib/Interpreter/CppInterOp.cpp @@ -822,6 +822,10 @@ namespace Cpp { return FD->getReturnType().getAsOpaquePtr(); } + if (auto* FD = llvm::dyn_cast_or_null(D)) { + return (FD->getTemplatedDecl())->getReturnType().getAsOpaquePtr(); + } + return 0; } diff --git a/unittests/CppInterOp/FunctionReflectionTest.cpp b/unittests/CppInterOp/FunctionReflectionTest.cpp index ea73faecd..7169013ce 100644 --- a/unittests/CppInterOp/FunctionReflectionTest.cpp +++ b/unittests/CppInterOp/FunctionReflectionTest.cpp @@ -228,7 +228,7 @@ TEST(FunctionReflectionTest, GetFunctionsUsingName) { } TEST(FunctionReflectionTest, GetFunctionReturnType) { - std::vector Decls, SubDecls; + std::vector Decls, SubDecls, TemplateSubDecls; std::string code = R"( namespace N { class C {}; } enum Switch { OFF, ON }; @@ -238,7 +238,6 @@ TEST(FunctionReflectionTest, GetFunctionReturnType) { int f () { return 0; } }; - void f1() {} double f2() { return 0.2; } Switch f3() { return ON; } @@ -248,22 +247,56 @@ TEST(FunctionReflectionTest, GetFunctionReturnType) { volatile N::C f7() { return N::C(); } const volatile N::C f8() { return N::C(); } int n; + + class MyTemplatedMethodClass { + template + char get_string(A) { + return 'A'; + } + + template + void get_size() {} + + template + long add_size (int i) { + return sizeof(A) + i; + } + }; )"; GetAllTopLevelDecls(code, Decls, true); GetAllSubDecls(Decls[2], SubDecls); + GetAllSubDecls(Decls[12], TemplateSubDecls); + + // #include EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[3])), "void"); - EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[4])), "double"); - EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[5])), "Switch"); + EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[4])), + "double"); + EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[5])), + "Switch"); EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[6])), "N::C"); - EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[7])), "N::C *"); - EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[8])), "const N::C"); - EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[9])), "volatile N::C"); - EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[10])), "const volatile N::C"); - EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[11])), "NULL TYPE"); + EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[7])), + "N::C *"); + EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[8])), + "const N::C"); + EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[9])), + "volatile N::C"); + EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[10])), + "const volatile N::C"); + EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[11])), + "NULL TYPE"); EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(SubDecls[1])), "void"); EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(SubDecls[2])), "int"); + EXPECT_EQ( + Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(TemplateSubDecls[1])), + "char"); + EXPECT_EQ( + Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(TemplateSubDecls[2])), + "void"); + EXPECT_EQ( + Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(TemplateSubDecls[3])), + "long"); } TEST(FunctionReflectionTest, GetFunctionNumArgs) {