r174570 - AST dumping: indicate the previous declaration for a redeclaration, and

Richard Smith richard-llvm at metafoo.co.uk
Wed Feb 6 17:35:44 PST 2013


Author: rsmith
Date: Wed Feb  6 19:35:44 2013
New Revision: 174570

URL: http://llvm.org/viewvc/llvm-project?rev=174570&view=rev
Log:
AST dumping: indicate the previous declaration for a redeclaration, and
indicate the semantic DC if it's not the lexical DC. In passing, correct
the ascii-art child marker for a child of a FriendDecl.

Modified:
    cfe/trunk/lib/AST/ASTDumper.cpp
    cfe/trunk/test/Misc/ast-dump-decl.cpp

Modified: cfe/trunk/lib/AST/ASTDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDumper.cpp?rev=174570&r1=174569&r2=174570&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ASTDumper.cpp (original)
+++ cfe/trunk/lib/AST/ASTDumper.cpp Wed Feb  6 19:35:44 2013
@@ -511,6 +511,27 @@ void ASTDumper::dumpAttr(const Attr *A)
 #include "clang/AST/AttrDump.inc"
 }
 
+static Decl *getPreviousDeclImpl(...) {
+  return 0;
+}
+
+template<typename T>
+static const Decl *getPreviousDeclImpl(const Redeclarable<T> *D) {
+  return D->getPreviousDecl();
+}
+
+/// Get the previous declaration in the redeclaration chain for a declaration.
+static const Decl *getPreviousDecl(const Decl *D) {
+  switch (D->getKind()) {
+#define DECL(DERIVED, BASE) \
+  case Decl::DERIVED: \
+    return getPreviousDeclImpl(cast<DERIVED##Decl>(D));
+#define ABSTRACT_DECL(DECL)
+#include "clang/AST/DeclNodes.inc"
+  }
+  llvm_unreachable("Decl that isn't part of DeclNodes.inc!");
+}
+
 //===----------------------------------------------------------------------===//
 //  C++ Utilities
 //===----------------------------------------------------------------------===//
@@ -639,6 +660,10 @@ void ASTDumper::dumpDecl(const Decl *D)
     OS << D->getDeclKindName() << "Decl";
   }
   dumpPointer(D);
+  if (D->getLexicalDeclContext() != D->getDeclContext())
+    OS << " parent " << cast<Decl>(D->getDeclContext());
+  if (const Decl *Prev = getPreviousDecl(D))
+    OS << " prev " << Prev;
   dumpSourceRange(D->getSourceRange());
 
   bool HasAttrs = D->attr_begin() != D->attr_end();
@@ -664,7 +689,7 @@ void ASTDumper::dumpDecl(const Decl *D)
 
   setMoreChildren(false);
   if (HasDeclContext)
-    dumpDeclContext(dyn_cast<DeclContext>(D));
+    dumpDeclContext(cast<DeclContext>(D));
 }
 
 void ASTDumper::VisitLabelDecl(const LabelDecl *D) {
@@ -1049,6 +1074,7 @@ void ASTDumper::VisitAccessSpecDecl(cons
 }
 
 void ASTDumper::VisitFriendDecl(const FriendDecl *D) {
+  lastChild();
   if (TypeSourceInfo *T = D->getFriendType())
     dumpType(T->getType());
   else

Modified: cfe/trunk/test/Misc/ast-dump-decl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/ast-dump-decl.cpp?rev=174570&r1=174569&r2=174570&view=diff
==============================================================================
--- cfe/trunk/test/Misc/ast-dump-decl.cpp (original)
+++ cfe/trunk/test/Misc/ast-dump-decl.cpp Wed Feb  6 19:35:44 2013
@@ -403,3 +403,16 @@ namespace TestFileScopeAsmDecl {
 // CHECK:      NamespaceDecl{{.*}} TestFileScopeAsmDecl{{$}}
 // CHECK:        FileScopeAsmDecl{{.*>$}}
 // CHECK-NEXT:     StringLiteral
+
+namespace TestFriendDecl2 {
+  void f();
+  struct S {
+    friend void f();
+  };
+}
+// CHECK: NamespaceDecl [[TestFriendDecl2:0x.*]] <{{.*}}> TestFriendDecl2
+// CHECK: |-FunctionDecl [[TestFriendDecl2_f:0x.*]] <{{.*}}> f 'void (void)'
+// CHECK: `-CXXRecordDecl {{.*}} struct S
+// CHECK:   |-CXXRecordDecl {{.*}} struct S
+// CHECK:   `-FriendDecl
+// CHECK:     `-FunctionDecl {{.*}} parent [[TestFriendDecl2]] prev [[TestFriendDecl2_f]] <{{.*}}> f 'void (void)'





More information about the cfe-commits mailing list