diff --git a/include/clang/Interpreter/CppInterOp.h b/include/clang/Interpreter/CppInterOp.h index 5d8180c88..2cbb66c61 100644 --- a/include/clang/Interpreter/CppInterOp.h +++ b/include/clang/Interpreter/CppInterOp.h @@ -425,7 +425,8 @@ namespace Cpp { CPPINTEROP_API bool IsVirtualMethod(TCppFunction_t method); /// Gets all the Fields/Data Members of a Class - CPPINTEROP_API std::vector GetDatamembers(TCppScope_t scope); + CPPINTEROP_API void GetDatamembers(TCppScope_t scope, + std::vector& datamembers); /// Gets all the Static Fields/Data Members of a Class ///\param[in] scope - class diff --git a/lib/Interpreter/CppInterOp.cpp b/lib/Interpreter/CppInterOp.cpp index d4b1578ea..1e2e66af7 100644 --- a/lib/Interpreter/CppInterOp.cpp +++ b/lib/Interpreter/CppInterOp.cpp @@ -1122,12 +1122,11 @@ namespace Cpp { return false; } - std::vector GetDatamembers(TCppScope_t scope) - { + void GetDatamembers(TCppScope_t scope, + std::vector& datamembers) { auto *D = (Decl *) scope; - if (auto *CXXRD = llvm::dyn_cast_or_null(D)) { - std::vector datamembers; + if (auto* CXXRD = llvm::dyn_cast_or_null(D)) { llvm::SmallVector stack_begin; llvm::SmallVector stack_end; stack_begin.push_back(CXXRD->field_begin()); @@ -1154,11 +1153,7 @@ namespace Cpp { datamembers.push_back((TCppScope_t)D); stack_begin.back()++; } - - return datamembers; } - - return {}; } void GetStaticDatamembers(TCppScope_t scope, diff --git a/unittests/CppInterOp/VariableReflectionTest.cpp b/unittests/CppInterOp/VariableReflectionTest.cpp index 0cc01c9de..a1bd02810 100644 --- a/unittests/CppInterOp/VariableReflectionTest.cpp +++ b/unittests/CppInterOp/VariableReflectionTest.cpp @@ -28,9 +28,11 @@ TEST(VariableReflectionTest, GetDatamembers) { void sum(int,int); )"; + std::vector datamembers; + std::vector datamembers1; GetAllTopLevelDecls(code, Decls); - auto datamembers = Cpp::GetDatamembers(Decls[0]); - auto datamembers1 = Cpp::GetDatamembers(Decls[1]); + Cpp::GetDatamembers(Decls[0], datamembers); + Cpp::GetDatamembers(Decls[1], datamembers1); // non static field EXPECT_EQ(Cpp::GetQualifiedName(datamembers[0]), "C::a"); @@ -97,9 +99,13 @@ TEST(VariableReflectionTest, DatamembersWithAnonymousStructOrUnion) { #undef Stringify #undef CODE - auto datamembers_klass1 = Cpp::GetDatamembers(Decls[0]); - auto datamembers_klass2 = Cpp::GetDatamembers(Decls[2]); - auto datamembers_klass3 = Cpp::GetDatamembers(Decls[4]); + std::vector datamembers_klass1; + std::vector datamembers_klass2; + std::vector datamembers_klass3; + + Cpp::GetDatamembers(Decls[0], datamembers_klass1); + Cpp::GetDatamembers(Decls[2], datamembers_klass2); + Cpp::GetDatamembers(Decls[4], datamembers_klass3); EXPECT_EQ(datamembers_klass1.size(), 3); EXPECT_EQ(datamembers_klass2.size(), 3); @@ -203,7 +209,8 @@ TEST(VariableReflectionTest, GetVariableOffset) { #undef Stringify #undef CODE - auto datamembers = Cpp::GetDatamembers(Decls[2]); + std::vector datamembers; + Cpp::GetDatamembers(Decls[2], datamembers); EXPECT_TRUE((bool) Cpp::GetVariableOffset(Decls[0])); // a EXPECT_TRUE((bool) Cpp::GetVariableOffset(Decls[1])); // N