From 820e99a80479ce09fdfbe5e826c9c3e43985eada Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Fri, 3 Aug 2018 16:11:32 -0700 Subject: [PATCH] Validate RecordDecl --- index_tests/usage/func_called_from_template.cc | 2 +- src/indexer.cc | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/index_tests/usage/func_called_from_template.cc b/index_tests/usage/func_called_from_template.cc index 868cc1b0..becca51b 100644 --- a/index_tests/usage/func_called_from_template.cc +++ b/index_tests/usage/func_called_from_template.cc @@ -27,7 +27,7 @@ OUTPUT: "bases": [], "derived": [], "vars": [], - "uses": ["5:3-5:9|10177235824697315808|3|16420", "5:3-5:9|2459767597003442547|3|16420"], + "uses": ["5:3-5:9|10177235824697315808|3|16420"], "callees": [] }, { "usr": 2459767597003442547, diff --git a/src/indexer.cc b/src/indexer.cc index f2909973..4083abf4 100644 --- a/src/indexer.cc +++ b/src/indexer.cc @@ -301,6 +301,19 @@ const Decl* GetSpecialized(const Decl* D) { return Template; } +bool ValidateRecord(const RecordDecl *RD) { + for (const auto *I : RD->fields()){ + QualType FQT = I->getType(); + if (FQT->isIncompleteType() || FQT->isDependentType()) + return false; + if (const RecordType *ChildType = I->getType()->getAs()) + if (const RecordDecl *Child = ChildType->getDecl()) + if (!ValidateRecord(Child)) + return false; + } + return true; +} + class IndexDataConsumer : public index::IndexDataConsumer { public: ASTContext *Ctx; @@ -835,7 +848,8 @@ public: int offset; std::tie(RD, offset) = Stack.back(); Stack.pop_back(); - if (!RD->isCompleteDefinition() || RD->isDependentType()) + if (!RD->isCompleteDefinition() || RD->isDependentType() || + !ValidateRecord(RD)) offset = -1; for (FieldDecl *FD : RD->fields()) { int offset1 = offset >= 0 ? offset + Ctx->getFieldOffset(FD) : -1;