Skip to content

Commit 63bf35b

Browse files
sudo-pandavgvassilev
authored andcommitted
Add support for multidim arrays in GetUnderlyingType
1 parent b1f0c6a commit 63bf35b

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

lib/Interpreter/CppInterOp.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1184,9 +1184,13 @@ namespace Cpp {
11841184
{
11851185
QualType QT = QualType::getFromOpaquePtr(type);
11861186
QT = QT->getCanonicalTypeUnqualified();
1187-
if (QT->isArrayType())
1187+
1188+
// Recursively remove array dimensions
1189+
while (QT->isArrayType())
11881190
QT = QualType(QT->getArrayElementTypeNoTypeQual(), 0);
11891191

1192+
// Recursively reduce pointer depth till we are left with a pointerless
1193+
// type.
11901194
for (auto PT = QT->getPointeeType(); !PT.isNull(); PT = QT->getPointeeType()){
11911195
QT = PT;
11921196
}

unittests/CppInterOp/TypeReflectionTest.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,8 @@ TEST(TypeReflectionTest, GetUnderlyingType) {
195195
int *&var9 = var8;
196196
int var10[] = {};
197197
int *var11[] = {var8};
198+
int var12[2][5];
199+
int ***var13;
198200
199201
class C {
200202
public:
@@ -212,6 +214,11 @@ TEST(TypeReflectionTest, GetUnderlyingType) {
212214
C *&cvar9 = cvar8;
213215
C cvar10[] = {};
214216
C *cvar11[] = {cvar8};
217+
C cvar12[2][5];
218+
C ***cvar13;
219+
220+
enum E { e1, e2 };
221+
E evar0 = e1;
215222
)";
216223
GetAllTopLevelDecls(code, Decls);
217224
auto get_underly_var_type_as_str = [] (Decl *D) {
@@ -229,9 +236,9 @@ TEST(TypeReflectionTest, GetUnderlyingType) {
229236
EXPECT_EQ(get_underly_var_type_as_str(Decls[9]), "int");
230237
EXPECT_EQ(get_underly_var_type_as_str(Decls[10]), "int");
231238
EXPECT_EQ(get_underly_var_type_as_str(Decls[11]), "int");
239+
EXPECT_EQ(get_underly_var_type_as_str(Decls[12]), "int");
240+
EXPECT_EQ(get_underly_var_type_as_str(Decls[13]), "int");
232241

233-
EXPECT_EQ(get_underly_var_type_as_str(Decls[13]), "C");
234-
EXPECT_EQ(get_underly_var_type_as_str(Decls[14]), "C");
235242
EXPECT_EQ(get_underly_var_type_as_str(Decls[15]), "C");
236243
EXPECT_EQ(get_underly_var_type_as_str(Decls[16]), "C");
237244
EXPECT_EQ(get_underly_var_type_as_str(Decls[17]), "C");
@@ -242,6 +249,12 @@ TEST(TypeReflectionTest, GetUnderlyingType) {
242249
EXPECT_EQ(get_underly_var_type_as_str(Decls[22]), "C");
243250
EXPECT_EQ(get_underly_var_type_as_str(Decls[23]), "C");
244251
EXPECT_EQ(get_underly_var_type_as_str(Decls[24]), "C");
252+
EXPECT_EQ(get_underly_var_type_as_str(Decls[25]), "C");
253+
EXPECT_EQ(get_underly_var_type_as_str(Decls[26]), "C");
254+
EXPECT_EQ(get_underly_var_type_as_str(Decls[27]), "C");
255+
EXPECT_EQ(get_underly_var_type_as_str(Decls[28]), "C");
256+
257+
EXPECT_EQ(get_underly_var_type_as_str(Decls[30]), "E");
245258
}
246259

247260
TEST(TypeReflectionTest, IsUnderlyingTypeRecordType) {

0 commit comments

Comments
 (0)