Skip to content

Commit c13391b

Browse files
authored
Teacg GetFunctionReturnType to return the type of template functions (#218)
1 parent 1272d1b commit c13391b

File tree

2 files changed

+46
-9
lines changed

2 files changed

+46
-9
lines changed

lib/Interpreter/CppInterOp.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,10 @@ namespace Cpp {
822822
return FD->getReturnType().getAsOpaquePtr();
823823
}
824824

825+
if (auto* FD = llvm::dyn_cast_or_null<clang::FunctionTemplateDecl>(D)) {
826+
return (FD->getTemplatedDecl())->getReturnType().getAsOpaquePtr();
827+
}
828+
825829
return 0;
826830
}
827831

unittests/CppInterOp/FunctionReflectionTest.cpp

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ TEST(FunctionReflectionTest, GetFunctionsUsingName) {
228228
}
229229

230230
TEST(FunctionReflectionTest, GetFunctionReturnType) {
231-
std::vector<Decl*> Decls, SubDecls;
231+
std::vector<Decl*> Decls, SubDecls, TemplateSubDecls;
232232
std::string code = R"(
233233
namespace N { class C {}; }
234234
enum Switch { OFF, ON };
@@ -238,7 +238,6 @@ TEST(FunctionReflectionTest, GetFunctionReturnType) {
238238
int f () { return 0; }
239239
};
240240
241-
242241
void f1() {}
243242
double f2() { return 0.2; }
244243
Switch f3() { return ON; }
@@ -248,22 +247,56 @@ TEST(FunctionReflectionTest, GetFunctionReturnType) {
248247
volatile N::C f7() { return N::C(); }
249248
const volatile N::C f8() { return N::C(); }
250249
int n;
250+
251+
class MyTemplatedMethodClass {
252+
template<class A>
253+
char get_string(A) {
254+
return 'A';
255+
}
256+
257+
template<class A>
258+
void get_size() {}
259+
260+
template<class A>
261+
long add_size (int i) {
262+
return sizeof(A) + i;
263+
}
264+
};
251265
)";
252266

253267
GetAllTopLevelDecls(code, Decls, true);
254268
GetAllSubDecls(Decls[2], SubDecls);
269+
GetAllSubDecls(Decls[12], TemplateSubDecls);
270+
271+
// #include <string>
255272

256273
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[3])), "void");
257-
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[4])), "double");
258-
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[5])), "Switch");
274+
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[4])),
275+
"double");
276+
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[5])),
277+
"Switch");
259278
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[6])), "N::C");
260-
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[7])), "N::C *");
261-
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[8])), "const N::C");
262-
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[9])), "volatile N::C");
263-
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[10])), "const volatile N::C");
264-
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[11])), "NULL TYPE");
279+
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[7])),
280+
"N::C *");
281+
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[8])),
282+
"const N::C");
283+
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[9])),
284+
"volatile N::C");
285+
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[10])),
286+
"const volatile N::C");
287+
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(Decls[11])),
288+
"NULL TYPE");
265289
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(SubDecls[1])), "void");
266290
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(SubDecls[2])), "int");
291+
EXPECT_EQ(
292+
Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(TemplateSubDecls[1])),
293+
"char");
294+
EXPECT_EQ(
295+
Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(TemplateSubDecls[2])),
296+
"void");
297+
EXPECT_EQ(
298+
Cpp::GetTypeAsString(Cpp::GetFunctionReturnType(TemplateSubDecls[3])),
299+
"long");
267300
}
268301

269302
TEST(FunctionReflectionTest, GetFunctionNumArgs) {

0 commit comments

Comments
 (0)