<div dir="ltr">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).<div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Thu, Mar 27, 2014 at 5:21 AM, Christian Schafmeister <span dir="ltr"><<a href="mailto:chris.schaf@verizon.net" target="_blank">chris.schaf@verizon.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word"><div><br></div>I isolated the problem to a function call that passes a lambda to another function.<div>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.</div>
<div><br></div><div><div class=""><font face="Courier">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.<br>
</font><div><br></div><div><br></div></div><div>I’m in the call stack after the assertion was thrown in the clang function ASTMatchersInternal.h:760</div><div><br></div><div><div><font face="Courier">  template <typename T></font></div>
<div><font face="Courier">  bool matchesAncestorOf(const T &Node,</font></div><div><font face="Courier">                         const DynTypedMatcher &Matcher,</font></div><div><font face="Courier">                         BoundNodesTreeBuilder *Builder,</font></div>
<div><font face="Courier">                         AncestorMatchMode MatchMode) {</font></div><div><font face="Courier">    TOOLING_COMPILE_ASSERT((llvm::is_base_of<Decl, T>::value ||</font></div><div><font face="Courier">                            llvm::is_base_of<Stmt, T>::value),</font></div>
<div><font face="Courier">                           only_Decl_or_Stmt_allowed_for_recursive_matching);</font></div><div><font face="Courier">—>    return matchesAncestorOf(ast_type_traits::DynTypedNode::create(Node),</font></div>
<div><font face="Courier">                             Matcher, Builder, MatchMode);</font></div><div><font face="Courier">  }</font></div></div><div><font face="Courier"><br></font></div><div><br></div><div><br></div><div>
<br></div><div><div><font face="Courier">(lldb) call Node.dump()</font></div><div><font face="Courier">call Node.dump()</font></div><div><font face="Courier">CXXRecordDecl 0x130e47260 <../../src/core/<a href="http://serialize.cc" target="_blank">serialize.cc</a>:487:30> class definition</font></div>
<div><font face="Courier">|-CXXMethodDecl 0x130e47390 <col:62, line:490:6> operator() 'void (mem::smart_ptr<SNode_O>) const' inline</font></div><div><font face="Courier">| |-ParmVarDecl 0x130e471a0 <line:487:34, col:58> node 'mem::smart_ptr<SNode_O>':'class mem::smart_ptr<class core::SNode_O>'</font></div>
<div><font face="Courier">| `-CompoundStmt 0x130e479a0 <col:65, line:490:6></font></div><div><font face="Courier">|   |-DeclStmt 0x130e47720 <line:488:3, col:28></font></div><div><font face="Courier">|   | `-VarDecl 0x130e47460 <col:3, col:27> obj 'T_sp':'class mem::smart_ptr<class core::T_O>'</font></div>
<div><font face="Courier">|   |   `-ExprWithCleanups 0x130e47708 <col:14, col:27> 'T_sp':'class mem::smart_ptr<class core::T_O>'</font></div><div><font face="Courier">|   |     `-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</font></div>
<div><font face="Courier">|   |       `-MaterializeTemporaryExpr 0x130e476b0 <col:14, col:27> 'const smart_ptr<class core::T_O>':'const class mem::smart_ptr<class core::T_O>' lvalue</font></div>
<div><font face="Courier">|   |         `-ImplicitCastExpr 0x130e47698 <col:14, col:27> 'const smart_ptr<class core::T_O>':'const class mem::smart_ptr<class core::T_O>' <NoOp></font></div>
<div><font face="Courier">|   |           `-CXXBindTemporaryExpr 0x130e475f8 <col:14, col:27> 'T_sp':'class mem::smart_ptr<class core::T_O>' (CXXTemporary 0x130e475f0)</font></div><div><font face="Courier">|   |             `-CXXMemberCallExpr 0x130e475b0 <col:14, col:27> 'T_sp':'class mem::smart_ptr<class core::T_O>'</font></div>
<div><font face="Courier">|   |               `-MemberExpr 0x130e47580 <col:14, col:20> '<bound member function type>' ->object 0x130a7ad20</font></div><div><font face="Courier">|   |                 `-ImplicitCastExpr 0x130e475d8 <col:14> 'const class core::SNode_O *' <NoOp></font></div>
<div><font face="Courier">|   |                   `-CXXOperatorCallExpr 0x130e47540 <col:14> 'class core::SNode_O *'</font></div><div><font face="Courier">|   |                     |-ImplicitCastExpr 0x130e47528 <col:18> 'class core::SNode_O *(*)(void) const' <FunctionToPointerDecay></font></div>
<div><font face="Courier">|   |                     | `-DeclRefExpr 0x130e47500 <col:18> 'class core::SNode_O *(void) const' lvalue CXXMethod 0x12b445470 'operator->' 'class core::SNode_O *(void) const'</font></div>
<div><font face="Courier">|   |                     `-ImplicitCastExpr 0x130e474e0 <col:14> 'const class mem::tagged_ptr<class core::SNode_O>' lvalue <UncheckedDerivedToBase (tagged_ptr)></font></div>
<div><font face="Courier">|   |                       `-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>'</font></div>
<div><font face="Courier">|   `-ExprWithCleanups 0x130e47988 <line:489:3, col:25> '_Bool'</font></div><div><font face="Courier">|     `-CXXMemberCallExpr 0x130e47858 <col:3, col:25> '_Bool'</font></div>
<div><font face="Courier">|       |-MemberExpr 0x130e47800 <col:3, col:8> '<bound member function type>' ->loadFinalize 0x12b4300a0</font></div><div><font face="Courier">|       | `-CXXOperatorCallExpr 0x130e477c0 <col:3> 'class core::T_O *'</font></div>
<div><font face="Courier">|       |   |-ImplicitCastExpr 0x130e477a8 <col:6> 'class core::T_O *(*)(void) const' <FunctionToPointerDecay></font></div><div><font face="Courier">|       |   | `-DeclRefExpr 0x130e47780 <col:6> 'class core::T_O *(void) const' lvalue CXXMethod 0x113d6bc80 'operator->' 'class core::T_O *(void) const'</font></div>
<div><font face="Courier">|       |   `-ImplicitCastExpr 0x130e47760 <col:3> 'const class mem::tagged_ptr<class core::T_O>' lvalue <UncheckedDerivedToBase (tagged_ptr)></font></div><div><font face="Courier">|       |     `-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>'</font></div>
<div><font face="Courier">|       `-CXXBindTemporaryExpr 0x130e47968 <col:21> 'core::ArchiveP':'class mem::smart_ptr<class core::SNode_O>' (CXXTemporary 0x130e47960)</font></div><div><font face="Courier">|         `-CXXConstructExpr 0x130e47920 <col:21> 'core::ArchiveP':'class mem::smart_ptr<class core::SNode_O>' 'void (const smart_ptr<class core::SNode_O> &)'</font></div>
<div><font face="Courier">|           `-ImplicitCastExpr 0x130e47908 <col:21> 'const smart_ptr<class core::SNode_O>':'const class mem::smart_ptr<class core::SNode_O>' lvalue <NoOp></font></div>
<div><font face="Courier">|             `-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>'</font></div>
<div><font face="Courier">|-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</font></div>
<div><font face="Courier">|-CXXMethodDecl 0x130e47cb0 <line:487:30, line:490:6> __invoke 'void (mem::smart_ptr<SNode_O>)' static inline</font></div><div><font face="Courier">| `-ParmVarDecl 0x130e47ba0 <line:487:34, col:58> node 'mem::smart_ptr<SNode_O>':'class mem::smart_ptr<class core::SNode_O>'</font></div>
<div><font face="Courier">|-CXXDestructorDecl 0x130e47db0 <col:30> ~ 'void (void) noexcept' inline</font></div><div><font face="Courier">| `-CompoundStmt 0x130e47e98 <col:30></font></div><div><font face="Courier">|-CXXConstructorDecl 0x130e5ed40 <col:30>  'void (void)' inline noexcept-unevaluated 0x130e5ed40</font></div>
<div><font face="Courier">|-CXXConstructorDecl 0x130e5ee70 <col:30>  'void (const class <lambda at ../../src/core/<a href="http://serialize.cc" target="_blank">serialize.cc</a>:487:30> &) noexcept' inline</font></div>
<div><font face="Courier">| |-ParmVarDecl 0x130e5efb0 <col:30> 'const class <lambda at ../../src/core/<a href="http://serialize.cc" target="_blank">serialize.cc</a>:487:30> &'</font></div><div><font face="Courier">| `-CompoundStmt 0x131c8d988 <col:30></font></div>
<div><font face="Courier">`-CXXConstructorDecl 0x130e5f010 <col:30>  'void (class <lambda at ../../src/core/<a href="http://serialize.cc" target="_blank">serialize.cc</a>:487:30> &&) noexcept' inline</font></div>
<div><font face="Courier">  |-ParmVarDecl 0x130e5f150 <col:30> 'class <lambda at ../../src/core/<a href="http://serialize.cc" target="_blank">serialize.cc</a>:487:30> &&'</font></div><div><font face="Courier">  `-CompoundStmt 0x130e5f1d0 <col:30></font></div>
<div><font face="Courier">(lldb) </font></div><div><br></div><div><br></div><div><br></div><div><a href="http://serialize.cc" target="_blank">serialize.cc</a>:487 corresponds to a function call that passes a lambda to another function:</div>
<div><br></div><div><div><font face="Courier">    void LoadArchive_O::finalizeObjects()</font></div><div><font face="Courier">    {_G();</font></div><div><font face="Courier"><span style="white-space:pre-wrap">        </span>this->_NodesToFinalize.map( [] (mem::smart_ptr<SNode_O> node)  {  // <<<<<---- Line 487</font></div>
<div><font face="Courier"><span style="white-space:pre-wrap">             </span>T_sp obj = node->object();</font></div><div><font face="Courier"><span style="white-space:pre-wrap">          </span>obj->loadFinalize(node);</font></div>
<div><font face="Courier"><span style="white-space:pre-wrap">     </span>    });</font></div><div><font face="Courier">    }</font></div><div><br></div></div><div class=""><div><br><div><div>On Mar 26, 2014, at 1:02 PM, Christian Schafmeister <<a href="mailto:chris.schaf@verizon.net" target="_blank">chris.schaf@verizon.net</a>> wrote:</div>
<br><blockquote type="cite"><br>I ran into an assertion failure while running matchers on my source code.<br><br>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?<br>
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.<br><br><br>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.<br>
<br>Thanks,<br><br>.Chris.<br><br><br></blockquote></div><br></div></div></div></div></div><br>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
<br></blockquote></div><br></div>