Index: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp =================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -2186,9 +2186,10 @@ std::vector DWARFASTParserClang::GetDIEForDeclContext( lldb_private::CompilerDeclContext decl_context) { std::vector result; - for (auto it = m_decl_ctx_to_die.find( - (clang::DeclContext *)decl_context.GetOpaqueDeclContext()); - it != m_decl_ctx_to_die.end(); it++) + auto opaque_decl_ctx = + (clang::DeclContext *)decl_context.GetOpaqueDeclContext(); + for (auto it = m_decl_ctx_to_die.find(opaque_decl_ctx); + it != m_decl_ctx_to_die.end() && it->first == opaque_decl_ctx; it++) result.push_back(it->second); return result; } Index: lldb/trunk/unittests/SymbolFile/DWARF/CMakeLists.txt =================================================================== --- lldb/trunk/unittests/SymbolFile/DWARF/CMakeLists.txt +++ lldb/trunk/unittests/SymbolFile/DWARF/CMakeLists.txt @@ -1,4 +1,5 @@ add_lldb_unittest(SymbolFileDWARFTests + DWARFASTParserClangTests.cpp SymbolFileDWARFTests.cpp LINK_LIBS Index: lldb/trunk/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp =================================================================== --- lldb/trunk/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp +++ lldb/trunk/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp @@ -0,0 +1,47 @@ +//===-- DWARFASTParserClangTests.cpp ----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "gtest/gtest.h" + +#include "Plugins/SymbolFile/DWARF/DWARFASTParserClang.h" +#include "Plugins/SymbolFile/DWARF/DWARFDIE.h" + +using namespace lldb; +using namespace lldb_private; + +namespace { +class DWARFASTParserClangStub : public DWARFASTParserClang { +public: + using DWARFASTParserClang::DWARFASTParserClang; + using DWARFASTParserClang::LinkDeclContextToDIE; +}; +} // namespace + +// If your implementation needs to dereference the dummy pointers we are +// defining here, causing this test to fail, feel free to delete it. +TEST(DWARFASTParserClangTests, + TestGetDIEForDeclContextReturnsOnlyMatchingEntries) { + ClangASTContext ast_ctx; + DWARFASTParserClangStub ast_parser(ast_ctx); + + DWARFUnit *unit = nullptr; + DWARFDIE die1(unit, (DWARFDebugInfoEntry *)1LL); + DWARFDIE die2(unit, (DWARFDebugInfoEntry *)2LL); + DWARFDIE die3(unit, (DWARFDebugInfoEntry *)3LL); + DWARFDIE die4(unit, (DWARFDebugInfoEntry *)4LL); + ast_parser.LinkDeclContextToDIE((clang::DeclContext *)1LL, die1); + ast_parser.LinkDeclContextToDIE((clang::DeclContext *)2LL, die2); + ast_parser.LinkDeclContextToDIE((clang::DeclContext *)2LL, die3); + ast_parser.LinkDeclContextToDIE((clang::DeclContext *)3LL, die4); + + auto die_list = ast_parser.GetDIEForDeclContext( + CompilerDeclContext(nullptr, (clang::DeclContext *)2LL)); + ASSERT_EQ(2u, die_list.size()); + ASSERT_EQ(die2, die_list[0]); + ASSERT_EQ(die3, die_list[1]); +}