Skip to content

Commit d93fc04

Browse files
authored
Update GetFunctionArgDefault for template functions (#225)
1 parent e9ada81 commit d93fc04

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

lib/Interpreter/CppInterOp.cpp

+7-2
Original file line numberDiff line numberDiff line change
@@ -3005,8 +3005,13 @@ namespace Cpp {
30053005
std::string GetFunctionArgDefault(TCppFunction_t func,
30063006
TCppIndex_t param_index) {
30073007
auto *D = (clang::Decl *)func;
3008-
auto *FD = llvm::dyn_cast_or_null<clang::FunctionDecl>(D);
3009-
auto PI = FD->getParamDecl(param_index);
3008+
clang::ParmVarDecl* PI;
3009+
3010+
if (auto* FD = llvm::dyn_cast_or_null<clang::FunctionDecl>(D))
3011+
PI = FD->getParamDecl(param_index);
3012+
3013+
else if (auto* FD = llvm::dyn_cast_or_null<clang::FunctionTemplateDecl>(D))
3014+
PI = (FD->getTemplatedDecl())->getParamDecl(param_index);
30103015

30113016
if (PI->hasDefaultArg())
30123017
{

unittests/CppInterOp/FunctionReflectionTest.cpp

+24
Original file line numberDiff line numberDiff line change
@@ -836,16 +836,40 @@ TEST(FunctionReflectionTest, GetFunctionArgDefault) {
836836
std::string code = R"(
837837
void f1(int i, double d = 4.0, const char *s = "default", char ch = 'c') {}
838838
void f2(float i = 0.0, double d = 3.123, long m = 34126) {}
839+
840+
template<class A, class B>
841+
long get_size(A, B, int i = 0) {}
842+
843+
template<class A = int, class B = char>
844+
long get_size(int i, A a = A(), B b = B()) {}
845+
846+
template<class A>
847+
void get_size(long k, A, char ch = 'a', double l = 0.0) {}
848+
839849
)";
840850

841851
GetAllTopLevelDecls(code, Decls);
852+
842853
EXPECT_EQ(Cpp::GetFunctionArgDefault(Decls[0], 0), "");
843854
EXPECT_EQ(Cpp::GetFunctionArgDefault(Decls[0], 1), "4.");
844855
EXPECT_EQ(Cpp::GetFunctionArgDefault(Decls[0], 2), "\"default\"");
845856
EXPECT_EQ(Cpp::GetFunctionArgDefault(Decls[0], 3), "\'c\'");
846857
EXPECT_EQ(Cpp::GetFunctionArgDefault(Decls[1], 0), "0.");
847858
EXPECT_EQ(Cpp::GetFunctionArgDefault(Decls[1], 1), "3.123");
848859
EXPECT_EQ(Cpp::GetFunctionArgDefault(Decls[1], 2), "34126");
860+
861+
EXPECT_EQ(Cpp::GetFunctionArgDefault(Decls[2], 0), "");
862+
EXPECT_EQ(Cpp::GetFunctionArgDefault(Decls[2], 1), "");
863+
EXPECT_EQ(Cpp::GetFunctionArgDefault(Decls[2], 2), "0");
864+
865+
EXPECT_EQ(Cpp::GetFunctionArgDefault(Decls[3], 0), "");
866+
EXPECT_EQ(Cpp::GetFunctionArgDefault(Decls[3], 1), "A()");
867+
EXPECT_EQ(Cpp::GetFunctionArgDefault(Decls[3], 2), "B()");
868+
869+
EXPECT_EQ(Cpp::GetFunctionArgDefault(Decls[4], 0), "");
870+
EXPECT_EQ(Cpp::GetFunctionArgDefault(Decls[4], 1), "");
871+
EXPECT_EQ(Cpp::GetFunctionArgDefault(Decls[4], 2), "\'a\'");
872+
EXPECT_EQ(Cpp::GetFunctionArgDefault(Decls[4], 3), "0.");
849873
}
850874

851875
TEST(FunctionReflectionTest, Construct) {

0 commit comments

Comments
 (0)