[cfe-dev] Question about failed assertion ASTMatchFinder.cc "Found node that is not in the parent map."
Christian Schafmeister
chris.schaf at verizon.net
Wed Mar 26 21:21:49 PDT 2014
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 <typename T>
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<class core::SNode_O>'
| `-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<class core::T_O>'
| | `-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<class core::T_O>' 'void (const smart_ptr<class core::T_O> &)' 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<class core::T_O>':'const class mem::smart_ptr<class core::T_O>' <NoOp>
| | `-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<class core::T_O>'
| | `-MemberExpr 0x130e47580 <col:14, col:20> '<bound member function type>' ->object 0x130a7ad20
| | `-ImplicitCastExpr 0x130e475d8 <col:14> 'const class core::SNode_O *' <NoOp>
| | `-CXXOperatorCallExpr 0x130e47540 <col:14> 'class core::SNode_O *'
| | |-ImplicitCastExpr 0x130e47528 <col:18> 'class core::SNode_O *(*)(void) const' <FunctionToPointerDecay>
| | | `-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<class core::SNode_O>' 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' <FunctionToPointerDecay>
| | | `-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<class core::T_O>' 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<class core::SNode_O>' (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<class core::SNode_O>':'const class mem::smart_ptr<class core::SNode_O>' lvalue <NoOp>
| `-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<class core::SNode_O>'
|-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:487:30> &) noexcept' inline
| |-ParmVarDecl 0x130e5efb0 <col:30> 'const class <lambda at ../../src/core/serialize.cc:487:30> &'
| `-CompoundStmt 0x131c8d988 <col:30>
`-CXXConstructorDecl 0x130e5f010 <col:30> 'void (class <lambda at ../../src/core/serialize.cc:487:30> &&) noexcept' inline
|-ParmVarDecl 0x130e5f150 <col:30> 'class <lambda at ../../src/core/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);
});
}
On Mar 26, 2014, at 1:02 PM, Christian Schafmeister <chris.schaf at verizon.net> wrote:
>
> 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.
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20140327/5170e1f5/attachment.html>
More information about the cfe-dev
mailing list