forked from OSchip/llvm-project
[lldb][NFC] Make CompilerDeclContext construction type safe
The CompilerDeclContext constructor takes a void* pointer which means that all callers of this constructor need to first explicitly convert all pointers to clang::DeclContext*. This causes that we for example can't just pass a TranslationUnitDecl* to the constructor without first casting it to its parent class (as it inherits from both Decl and DeclContext so the void* pointer is actually a Decl*). This patch introduces a utility function in the ClangASTContext which gets rid of the requirement to cast all pointers to clang::DeclContext. Also moves all constructor calls to use this function instead which is NFC (beside the change in DWARFASTParserClangTests.cpp).
This commit is contained in:
parent
6d5e35e89d
commit
42ec584a8b
|
@ -440,6 +440,12 @@ public:
|
||||||
|
|
||||||
// CompilerDeclContext override functions
|
// CompilerDeclContext override functions
|
||||||
|
|
||||||
|
/// Creates a CompilerDeclContext from the given DeclContext
|
||||||
|
/// with the current ClangASTContext instance as its typesystem.
|
||||||
|
/// The DeclContext has to come from the ASTContext of this
|
||||||
|
/// ClangASTContext.
|
||||||
|
CompilerDeclContext CreateDeclContext(clang::DeclContext *ctx);
|
||||||
|
|
||||||
std::vector<CompilerDecl>
|
std::vector<CompilerDecl>
|
||||||
DeclContextFindDeclByName(void *opaque_decl_ctx, ConstString name,
|
DeclContextFindDeclByName(void *opaque_decl_ctx, ConstString name,
|
||||||
const bool ignore_using_decls) override;
|
const bool ignore_using_decls) override;
|
||||||
|
|
|
@ -682,9 +682,7 @@ void ClangExpressionDeclMap::FindExternalVisibleDecls(
|
||||||
dyn_cast<NamespaceDecl>(context.m_decl_context)) {
|
dyn_cast<NamespaceDecl>(context.m_decl_context)) {
|
||||||
if (namespace_context->getName().str() ==
|
if (namespace_context->getName().str() ==
|
||||||
std::string(g_lldb_local_vars_namespace_cstr)) {
|
std::string(g_lldb_local_vars_namespace_cstr)) {
|
||||||
CompilerDeclContext compiler_decl_ctx(
|
CompilerDeclContext compiler_decl_ctx = GetClangASTContext()->CreateDeclContext(const_cast<clang::DeclContext*>(context.m_decl_context));
|
||||||
GetClangASTContext(), const_cast<void *>(static_cast<const void *>(
|
|
||||||
context.m_decl_context)));
|
|
||||||
FindExternalVisibleDecls(context, lldb::ModuleSP(), compiler_decl_ctx,
|
FindExternalVisibleDecls(context, lldb::ModuleSP(), compiler_decl_ctx,
|
||||||
current_id);
|
current_id);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -2218,7 +2218,7 @@ CompilerDeclContext
|
||||||
DWARFASTParserClang::GetDeclContextForUIDFromDWARF(const DWARFDIE &die) {
|
DWARFASTParserClang::GetDeclContextForUIDFromDWARF(const DWARFDIE &die) {
|
||||||
clang::DeclContext *clang_decl_ctx = GetClangDeclContextForDIE(die);
|
clang::DeclContext *clang_decl_ctx = GetClangDeclContextForDIE(die);
|
||||||
if (clang_decl_ctx)
|
if (clang_decl_ctx)
|
||||||
return CompilerDeclContext(&m_ast, clang_decl_ctx);
|
return m_ast.CreateDeclContext(clang_decl_ctx);
|
||||||
return CompilerDeclContext();
|
return CompilerDeclContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2227,7 +2227,7 @@ DWARFASTParserClang::GetDeclContextContainingUIDFromDWARF(const DWARFDIE &die) {
|
||||||
clang::DeclContext *clang_decl_ctx =
|
clang::DeclContext *clang_decl_ctx =
|
||||||
GetClangDeclContextContainingDIE(die, nullptr);
|
GetClangDeclContextContainingDIE(die, nullptr);
|
||||||
if (clang_decl_ctx)
|
if (clang_decl_ctx)
|
||||||
return CompilerDeclContext(&m_ast, clang_decl_ctx);
|
return m_ast.CreateDeclContext(clang_decl_ctx);
|
||||||
return CompilerDeclContext();
|
return CompilerDeclContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1343,7 +1343,7 @@ CompilerType PdbAstBuilder::ToCompilerType(clang::QualType qt) {
|
||||||
|
|
||||||
CompilerDeclContext
|
CompilerDeclContext
|
||||||
PdbAstBuilder::ToCompilerDeclContext(clang::DeclContext &context) {
|
PdbAstBuilder::ToCompilerDeclContext(clang::DeclContext &context) {
|
||||||
return {&m_clang, &context};
|
return m_clang.CreateDeclContext(&context);
|
||||||
}
|
}
|
||||||
|
|
||||||
clang::Decl * PdbAstBuilder::FromCompilerDecl(CompilerDecl decl) {
|
clang::Decl * PdbAstBuilder::FromCompilerDecl(CompilerDecl decl) {
|
||||||
|
|
|
@ -556,7 +556,7 @@ lldb::TypeSP PDBASTParser::CreateLLDBTypeFromPDBType(const PDBSymbol &type) {
|
||||||
CompilerType target_ast_type = target_type->GetFullCompilerType();
|
CompilerType target_ast_type = target_type->GetFullCompilerType();
|
||||||
|
|
||||||
ast_typedef = m_ast.CreateTypedefType(
|
ast_typedef = m_ast.CreateTypedefType(
|
||||||
target_ast_type, name.c_str(), CompilerDeclContext(&m_ast, decl_ctx));
|
target_ast_type, name.c_str(), m_ast.CreateDeclContext(decl_ctx));
|
||||||
if (!ast_typedef)
|
if (!ast_typedef)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
|
|
|
@ -666,7 +666,7 @@ SymbolFilePDB::GetDeclContextForUID(lldb::user_id_t uid) {
|
||||||
if (!decl_context)
|
if (!decl_context)
|
||||||
return GetDeclContextContainingUID(uid);
|
return GetDeclContextContainingUID(uid);
|
||||||
|
|
||||||
return CompilerDeclContext(clang_ast_ctx, decl_context);
|
return clang_ast_ctx->CreateDeclContext(decl_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
lldb_private::CompilerDeclContext
|
lldb_private::CompilerDeclContext
|
||||||
|
@ -695,7 +695,7 @@ SymbolFilePDB::GetDeclContextContainingUID(lldb::user_id_t uid) {
|
||||||
auto decl_context = pdb->GetDeclContextContainingSymbol(*symbol);
|
auto decl_context = pdb->GetDeclContextContainingSymbol(*symbol);
|
||||||
assert(decl_context);
|
assert(decl_context);
|
||||||
|
|
||||||
return CompilerDeclContext(clang_ast_ctx, decl_context);
|
return clang_ast_ctx->CreateDeclContext(decl_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SymbolFilePDB::ParseDeclsForContext(
|
void SymbolFilePDB::ParseDeclsForContext(
|
||||||
|
@ -1703,8 +1703,7 @@ lldb_private::CompilerDeclContext SymbolFilePDB::FindNamespace(
|
||||||
if (!namespace_decl)
|
if (!namespace_decl)
|
||||||
return CompilerDeclContext();
|
return CompilerDeclContext();
|
||||||
|
|
||||||
return CompilerDeclContext(clang_type_system,
|
return clang_type_system->CreateDeclContext(namespace_decl);
|
||||||
static_cast<clang::DeclContext *>(namespace_decl));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lldb_private::ConstString SymbolFilePDB::GetPluginName() {
|
lldb_private::ConstString SymbolFilePDB::GetPluginName() {
|
||||||
|
|
|
@ -1205,9 +1205,13 @@ CompilerType ClangASTContext::GetTypeForDecl(void *opaque_decl) {
|
||||||
return CompilerType();
|
return CompilerType();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CompilerDeclContext ClangASTContext::CreateDeclContext(DeclContext *ctx) {
|
||||||
|
return CompilerDeclContext(this, ctx);
|
||||||
|
}
|
||||||
|
|
||||||
CompilerType ClangASTContext::GetTypeForDecl(clang::NamedDecl *decl) {
|
CompilerType ClangASTContext::GetTypeForDecl(clang::NamedDecl *decl) {
|
||||||
if (clang::ObjCInterfaceDecl *interface_decl =
|
if (clang::ObjCInterfaceDecl *interface_decl =
|
||||||
llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
|
llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
|
||||||
return GetTypeForDecl(interface_decl);
|
return GetTypeForDecl(interface_decl);
|
||||||
if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
|
if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
|
||||||
return GetTypeForDecl(tag_decl);
|
return GetTypeForDecl(tag_decl);
|
||||||
|
@ -9039,10 +9043,8 @@ ConstString ClangASTContext::DeclGetMangledName(void *opaque_decl) {
|
||||||
|
|
||||||
CompilerDeclContext ClangASTContext::DeclGetDeclContext(void *opaque_decl) {
|
CompilerDeclContext ClangASTContext::DeclGetDeclContext(void *opaque_decl) {
|
||||||
if (opaque_decl)
|
if (opaque_decl)
|
||||||
return CompilerDeclContext(this,
|
return CreateDeclContext(((clang::Decl *)opaque_decl)->getDeclContext());
|
||||||
((clang::Decl *)opaque_decl)->getDeclContext());
|
return CompilerDeclContext();
|
||||||
else
|
|
||||||
return CompilerDeclContext();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CompilerType ClangASTContext::DeclGetFunctionReturnType(void *opaque_decl) {
|
CompilerType ClangASTContext::DeclGetFunctionReturnType(void *opaque_decl) {
|
||||||
|
@ -9108,7 +9110,7 @@ std::vector<CompilerDecl> ClangASTContext::DeclContextFindDeclByName(
|
||||||
if (!searched.insert(it->second).second)
|
if (!searched.insert(it->second).second)
|
||||||
continue;
|
continue;
|
||||||
symbol_file->ParseDeclsForContext(
|
symbol_file->ParseDeclsForContext(
|
||||||
CompilerDeclContext(this, it->second));
|
CreateDeclContext(it->second));
|
||||||
|
|
||||||
for (clang::Decl *child : it->second->decls()) {
|
for (clang::Decl *child : it->second->decls()) {
|
||||||
if (clang::UsingDirectiveDecl *ud =
|
if (clang::UsingDirectiveDecl *ud =
|
||||||
|
@ -9223,7 +9225,7 @@ uint32_t ClangASTContext::CountDeclLevels(clang::DeclContext *frame_decl_ctx,
|
||||||
|
|
||||||
searched.insert(it->second);
|
searched.insert(it->second);
|
||||||
symbol_file->ParseDeclsForContext(
|
symbol_file->ParseDeclsForContext(
|
||||||
CompilerDeclContext(this, it->second));
|
CreateDeclContext(it->second));
|
||||||
|
|
||||||
for (clang::Decl *child : it->second->decls()) {
|
for (clang::Decl *child : it->second->decls()) {
|
||||||
if (clang::UsingDirectiveDecl *ud =
|
if (clang::UsingDirectiveDecl *ud =
|
||||||
|
|
|
@ -414,8 +414,7 @@ TEST_F(TestClangASTContext, TemplateArguments) {
|
||||||
|
|
||||||
// typedef foo<int, 47> foo_def;
|
// typedef foo<int, 47> foo_def;
|
||||||
CompilerType typedef_type = m_ast->CreateTypedefType(
|
CompilerType typedef_type = m_ast->CreateTypedefType(
|
||||||
type, "foo_def",
|
type, "foo_def", m_ast->CreateDeclContext(m_ast->GetTranslationUnitDecl()));
|
||||||
CompilerDeclContext(m_ast.get(), m_ast->GetTranslationUnitDecl()));
|
|
||||||
|
|
||||||
CompilerType auto_type(
|
CompilerType auto_type(
|
||||||
m_ast.get(),
|
m_ast.get(),
|
||||||
|
|
|
@ -61,7 +61,7 @@ TEST_F(DWARFASTParserClangTests,
|
||||||
for (int i = 0; i < 4; ++i)
|
for (int i = 0; i < 4; ++i)
|
||||||
ast_parser.LinkDeclContextToDIE(decl_ctxs[i], dies[i]);
|
ast_parser.LinkDeclContextToDIE(decl_ctxs[i], dies[i]);
|
||||||
ast_parser.EnsureAllDIEsInDeclContextHaveBeenParsed(
|
ast_parser.EnsureAllDIEsInDeclContextHaveBeenParsed(
|
||||||
CompilerDeclContext(nullptr, decl_ctxs[1]));
|
ast_ctx.CreateDeclContext(decl_ctxs[1]));
|
||||||
|
|
||||||
EXPECT_THAT(ast_parser.GetDeclContextToDIEMapKeys(),
|
EXPECT_THAT(ast_parser.GetDeclContextToDIEMapKeys(),
|
||||||
testing::UnorderedElementsAre(decl_ctxs[0], decl_ctxs[3]));
|
testing::UnorderedElementsAre(decl_ctxs[0], decl_ctxs[3]));
|
||||||
|
|
Loading…
Reference in New Issue