Question about failed assertion ASTMatchFinder.cc "Found node that is not in the parent map."

I ran into an assertion failure while running matchers on my source code.

It will take me several hours of run time to recreate the error in the debugger - does anyone have an idea what might be causing this failure?
Any advice would arm me as I enter into what could be many hours of trying to recreate it under conditions where I can interrogate the local variables to see what in my source code is causing this problem.

Assertion failed: (false && "Found node that is not in the parent map."), function memoizedMatchesAncestorOfRecursively, file /Users/meister/Development/new_cando/brcl/externals/src/llvm-198807/tools/clang/lib/ASTMatchers/ASTMatchFinder.cpp, line 505.

Thanks,

.Chris.

I isolated the problem to a function call that passes a lambda to another function.For some reason I get this assertion failure when I run an AST matcher on C++ source with a function call that passes a lambda to another function.

Assertion failed: (false && “Found node that is not in the parent map.”), function memoizedMatchesAncestorOfRecursively, file /Users/meister/Development/new_cando/brcl/externals/src/llvm-198807/tools/clang/lib/ASTMatchers/ASTMatchFinder.cpp, line 505.

I’m in the call stack after the assertion was thrown in the clang function ASTMatchersInternal.h:760

template
bool matchesAncestorOf(const T &Node,
const DynTypedMatcher &Matcher,
BoundNodesTreeBuilder *Builder,
AncestorMatchMode MatchMode) {
TOOLING_COMPILE_ASSERT((llvm::is_base_of<Decl, T>::value ||
llvm::is_base_of<Stmt, T>::value),
only_Decl_or_Stmt_allowed_for_recursive_matching);
—> return matchesAncestorOf(ast_type_traits::DynTypedNode::create(Node),
Matcher, Builder, MatchMode);
}

(lldb) call Node.dump()
call Node.dump()
CXXRecordDecl 0x130e47260 <…/…/src/core/serialize.cc:487:30> class definition

-CXXMethodDecl 0x130e47390 <col:62, line:490:6> operator() ‘void (mem::smart_ptr<SNode_O>) const’ inline

-ParmVarDecl 0x130e471a0 <line:487:34, col:58> node ‘mem::smart_ptr<SNode_O>’:‘class mem::smart_ptr’
-CompoundStmt 0x130e479a0 <col:65, line:490:6> -DeclStmt 0x130e47720 <line:488:3, col:28> -VarDecl 0x130e47460 <col:3, col:27> obj ‘T_sp’:‘class mem::smart_ptr’
-ExprWithCleanups 0x130e47708 <col:14, col:27> 'T_sp':'class mem::smart_ptr<class core::T_O>' -CXXConstructExpr 0x130e476d0 <col:14, col:27> ‘T_sp’:‘class mem::smart_ptr’ ‘void (const smart_ptr &)’ elidable
-MaterializeTemporaryExpr 0x130e476b0 <col:14, col:27> 'const smart_ptr<class core::T_O>':'const class mem::smart_ptr<class core::T_O>' lvalue -ImplicitCastExpr 0x130e47698 <col:14, col:27> ‘const smart_ptr’:‘const class mem::smart_ptr’
-CXXBindTemporaryExpr 0x130e475f8 <col:14, col:27> 'T_sp':'class mem::smart_ptr<class core::T_O>' (CXXTemporary 0x130e475f0) -CXXMemberCallExpr 0x130e475b0 <col:14, col:27> ‘T_sp’:‘class mem::smart_ptr’
-MemberExpr 0x130e47580 <col:14, col:20> '<bound member function type>' ->object 0x130a7ad20 -ImplicitCastExpr 0x130e475d8 col:14 ‘const class core::SNode_O *’
`-CXXOperatorCallExpr 0x130e47540 col:14 ‘class core::SNode_O *’

-ImplicitCastExpr 0x130e47528 col:18 ‘class core::SNode_O ()(void) const’
-DeclRefExpr 0x130e47500 <col:18> 'class core::SNode_O *(void) const' lvalue CXXMethod 0x12b445470 'operator->' 'class core::SNode_O *(void) const' -ImplicitCastExpr 0x130e474e0 col:14 ‘const class mem::tagged_ptr’ lvalue <UncheckedDerivedToBase (tagged_ptr)>
-DeclRefExpr 0x130e474b8 <col:14> 'mem::smart_ptr<SNode_O>':'class mem::smart_ptr<class core::SNode_O>' lvalue ParmVar 0x130e471a0 'node' 'mem::smart_ptr<SNode_O>':'class mem::smart_ptr<class core::SNode_O>' -ExprWithCleanups 0x130e47988 <line:489:3, col:25> ‘_Bool’
-CXXMemberCallExpr 0x130e47858 <col:3, col:25> '_Bool' -MemberExpr 0x130e47800 <col:3, col:8> '<bound member function type>' ->loadFinalize 0x12b4300a0 -CXXOperatorCallExpr 0x130e477c0 col:3 ‘class core::T_O *’
-ImplicitCastExpr 0x130e477a8 col:6 ‘class core::T_O ()(void) const’
-DeclRefExpr 0x130e47780 <col:6> 'class core::T_O *(void) const' lvalue CXXMethod 0x113d6bc80 'operator->' 'class core::T_O *(void) const' -ImplicitCastExpr 0x130e47760 col:3 ‘const class mem::tagged_ptr’ lvalue <UncheckedDerivedToBase (tagged_ptr)>
-DeclRefExpr 0x130e47738 <col:3> 'T_sp':'class mem::smart_ptr<class core::T_O>' lvalue Var 0x130e47460 'obj' 'T_sp':'class mem::smart_ptr<class core::T_O>' -CXXBindTemporaryExpr 0x130e47968 col:21 ‘core::ArchiveP’:‘class mem::smart_ptr’ (CXXTemporary 0x130e47960)
-CXXConstructExpr 0x130e47920 <col:21> 'core::ArchiveP':'class mem::smart_ptr<class core::SNode_O>' 'void (const smart_ptr<class core::SNode_O> &)' -ImplicitCastExpr 0x130e47908 col:21 ‘const smart_ptr’:‘const class mem::smart_ptr’ lvalue
-DeclRefExpr 0x130e47830 <col:21> 'mem::smart_ptr<SNode_O>':'class mem::smart_ptr<class core::SNode_O>' lvalue ParmVar 0x130e471a0 'node' 'mem::smart_ptr<SNode_O>':'class mem::smart_ptr<class core::SNode_O>' -CXXConversionDecl 0x130e47c00 <line:487:30, line:490:6> operator void (*)(class mem::smart_ptr<class core::SNode_O>) 'void (*(void) const)(mem::smart_ptr<SNode_O>)' inline -CXXMethodDecl 0x130e47cb0 <line:487:30, line:490:6> __invoke 'void (mem::smart_ptr<SNode_O>)' static inline -ParmVarDecl 0x130e47ba0 <line:487:34, col:58> node ‘mem::smart_ptr<SNode_O>’:‘class mem::smart_ptr’
-CXXDestructorDecl 0x130e47db0 col:30 ~ ‘void (void) noexcept’ inline
-CompoundStmt 0x130e47e98 <col:30> -CXXConstructorDecl 0x130e5ed40 <col:30> 'void (void)' inline noexcept-unevaluated 0x130e5ed40 -CXXConstructorDecl 0x130e5ee70 <col:30> 'void (const class <lambda at ../../src/core/[serialize.cc](http://serialize.cc):487:30> &) noexcept' inline -ParmVarDecl 0x130e5efb0 <col:30> 'const class <lambda at ../../src/core/[serialize.cc](http://serialize.cc):487:30> &' -CompoundStmt 0x131c8d988 col:30
-CXXConstructorDecl 0x130e5f010 <col:30> 'void (class <lambda at ../../src/core/[serialize.cc](http://serialize.cc):487:30> &&) noexcept' inline -ParmVarDecl 0x130e5f150 <col:30> 'class <lambda at ../../src/core/[serialize.cc](http://serialize.cc):487:30> &&' -CompoundStmt 0x130e5f1d0 col:30
(lldb)

serialize.cc:487 corresponds to a function call that passes a lambda to another function:

void LoadArchive_O::finalizeObjects()
{_G();
this->_NodesToFinalize.map( (mem::smart_ptr<SNode_O> node) { // <<<<<---- Line 487
T_sp obj = node->object();
obj->loadFinalize(node);
});
}

I’ll need to look into this more. As a workaround, you can compile without assertions, and the code should work fine (or just remove the assertion).