[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