<div dir="ltr">Ah, I've figured out why this happens, it's because I call TraverseDecl from ASTConsumer::HandleTopLevelDecl(), so the full AST isn't traversed at this point. So now I need to figure out how to traverse the AST only after fully parsing it....<div><br></div><div><div><font face="courier new, monospace">class MyASTConsumer : public ASTConsumer {</font></div><div><font face="courier new, monospace">  public:</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">   </span>virtual bool HandleTopLevelDecl(DeclGroupRef d) {</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">         </span>typedef DeclGroupRef::iterator iter;</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">              </span>MyRecursiveASTVisitor rv;</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">         </span>for (iter b = d.begin(), e = d.end(); b != e; ++b) {</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">                      </span>rv.TraverseDecl(*b);</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">              </span>}</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">         </span>return true;</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">      </span>}</font></div><div><font face="courier new, monospace">};</font></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Sep 30, 2014 at 12:34 PM, Mihai Draghicioiu <span dir="ltr"><<a href="mailto:mihai.draghicioiu@gmail.com" target="_blank">mihai.draghicioiu@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><span class=""><p dir="ltr" style="font-family:arial,sans-serif;font-size:13px">> There is a helper like getDefiningDecl which will get the second vardecl if you've already parsed it.</p></span><p style="font-family:arial,sans-serif;font-size:13px">Can you be more specific please? I can't find this helper method in any class.</p><span class=""><p style="font-family:arial,sans-serif;font-size:13px"><br></p><p style="font-family:arial,sans-serif;font-size:13px">> A redeclaration chain contains all redeclarations, that's the idea, it is a circular singly-linked list.<br>> You should be able to traverse the chain with getFirstDecl(), getMostRecentDecl() and friends from Redeclarable.h.</p></span><div style="font-family:arial,sans-serif;font-size:13px">I am able to traverse the chain, but if I traverse it inside VisitVarDecl() or TraverseVarDecl(), upon the first VarDecl, the list only contains itself, and uopn the second VarDecl, the list contains both.</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">The code I used to test is this:</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">     </span>void printSourceRange(SourceRange r) {</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">          </span>llvm::outs()</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">                    </span><< r.getBegin().printToString(ci.getSourceManager())</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">                      </span><< "---"</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">                        </span><< r.getEnd().printToString(ci.getSourceManager());</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">       </span>}</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">     </span>bool TraverseVarDecl(VarDecl *d) {</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">              </span>llvm::outs() << "VarDecl " << d->getName() << " @";</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">            </span>printSourceRange(d->getSourceRange());</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">               </span>llvm::outs() << "\n";</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">           </span>llvm::outs() << "first decl @";</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">         </span>printSourceRange(d->getFirstDecl()->getSourceRange());</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">            </span>llvm::outs() << "\n";</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">           </span>llvm::outs() << "most recent decl @";</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">           </span>printSourceRange(d->getMostRecentDecl()->getSourceRange());</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">               </span>llvm::outs() << "\n";</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">           </span>for(auto r: d->redecls()) {</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">                  </span>llvm::outs() << "redecl " << d->getName() << " @";</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">                     </span>printSourceRange(r->getSourceRange());</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">                       </span>llvm::outs() << "\n";</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">           </span>}</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">               </span>return true;</font></div><div><span style="font-family:'courier new',monospace;white-space:pre-wrap">    </span><span style="font-family:'courier new',monospace">}</span></div><div><span style="font-family:'courier new',monospace"><br></span></div>Output looks like this:</div><div><br></div><div><div><font face="courier new, monospace">VarDecl poop @foo.cpp:2:2---foo.cpp:2:13</font></div><div><font face="courier new, monospace">first decl @foo.cpp:2:2---foo.cpp:2:13</font></div><div><font face="courier new, monospace">most recent decl @foo.cpp:2:2---foo.cpp:2:13</font></div><div><font face="courier new, monospace">redecl poop @foo.cpp:2:2---foo.cpp:2:13</font></div><div><font face="courier new, monospace"><br></font></div><div><div><font face="courier new, monospace">VarDecl poop @foo.cpp:5:1---foo.cpp:5:17</font></div><div><font face="courier new, monospace">first decl @foo.cpp:2:2---foo.cpp:2:13</font></div><div><font face="courier new, monospace">most recent decl @foo.cpp:5:1---foo.cpp:5:17</font></div><div><font face="courier new, monospace">redecl poop @foo.cpp:5:1---foo.cpp:5:17</font></div><div><font face="courier new, monospace">redecl poop @foo.cpp:2:2---foo.cpp:2:13</font></div></div><div><br></div><div>As you can see, the only reference to the VarDecl at foo.cpp:5:1 i get is upon the second call of TraverseVarDecl, and I want to get it at the first call.</div><div><br></div><div>Am I misunderstanding something, or doing something wrong? It looks like the two VarDecls have two different lists of redeclarations, which do not correspond.</div><div><br></div><div>Thanks.</div></div></div>
</blockquote></div><br></div>