Skip to content

Commit ffeec07

Browse files
authored
Update GetFunctionArgName API for template functions (#224)
1 parent d93fc04 commit ffeec07

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

Diff for: lib/Interpreter/CppInterOp.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -3052,8 +3052,12 @@ namespace Cpp {
30523052
std::string GetFunctionArgName(TCppFunction_t func, TCppIndex_t param_index)
30533053
{
30543054
auto *D = (clang::Decl *)func;
3055-
auto *FD = llvm::cast<clang::FunctionDecl>(D);
3056-
auto PI = FD->getParamDecl(param_index);
3055+
clang::ParmVarDecl* PI;
3056+
3057+
if (auto* FD = llvm::dyn_cast_or_null<clang::FunctionDecl>(D))
3058+
PI = FD->getParamDecl(param_index);
3059+
else if (auto* FD = llvm::dyn_cast_or_null<clang::FunctionTemplateDecl>(D))
3060+
PI = (FD->getTemplatedDecl())->getParamDecl(param_index);
30573061

30583062
return PI->getNameAsString();
30593063
}

Diff for: unittests/CppInterOp/FunctionReflectionTest.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,15 @@ TEST(FunctionReflectionTest, GetFunctionArgName) {
818818
std::string code = R"(
819819
void f1(int i, double d, long l, char ch) {}
820820
void f2(const int i, double d[], long *l, char ch[4]) {}
821+
822+
template<class A, class B>
823+
long get_size(A, B, int i = 0) {}
824+
825+
template<class A = int, class B = char>
826+
long get_size(int i, A a = A(), B b = B()) {}
827+
828+
template<class A>
829+
void get_size(long k, A, char ch = 'a', double l = 0.0) {}
821830
)";
822831

823832
GetAllTopLevelDecls(code, Decls);
@@ -829,6 +838,19 @@ TEST(FunctionReflectionTest, GetFunctionArgName) {
829838
EXPECT_EQ(Cpp::GetFunctionArgName(Decls[1], 1), "d");
830839
EXPECT_EQ(Cpp::GetFunctionArgName(Decls[1], 2), "l");
831840
EXPECT_EQ(Cpp::GetFunctionArgName(Decls[1], 3), "ch");
841+
842+
EXPECT_EQ(Cpp::GetFunctionArgName(Decls[2], 0), "");
843+
EXPECT_EQ(Cpp::GetFunctionArgName(Decls[2], 1), "");
844+
EXPECT_EQ(Cpp::GetFunctionArgName(Decls[2], 2), "i");
845+
846+
EXPECT_EQ(Cpp::GetFunctionArgName(Decls[3], 0), "i");
847+
EXPECT_EQ(Cpp::GetFunctionArgName(Decls[3], 1), "a");
848+
EXPECT_EQ(Cpp::GetFunctionArgName(Decls[3], 2), "b");
849+
850+
EXPECT_EQ(Cpp::GetFunctionArgName(Decls[4], 0), "k");
851+
EXPECT_EQ(Cpp::GetFunctionArgName(Decls[4], 1), "");
852+
EXPECT_EQ(Cpp::GetFunctionArgName(Decls[4], 2), "ch");
853+
EXPECT_EQ(Cpp::GetFunctionArgName(Decls[4], 3), "l");
832854
}
833855

834856
TEST(FunctionReflectionTest, GetFunctionArgDefault) {

0 commit comments

Comments
 (0)