From 98ae3616cd1536643a78beeddff119c028f71df6 Mon Sep 17 00:00:00 2001 From: Sam McCall Date: Tue, 10 Jan 2023 10:51:34 +0100 Subject: [PATCH] [AST] include decls owned by FriendDecl in -ast-dump Differential Revision: https://reviews.llvm.org/D141362 --- clang/include/clang/AST/ASTNodeTraverser.h | 9 ++++++++- clang/test/AST/ast-dump-decl.cpp | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/AST/ASTNodeTraverser.h b/clang/include/clang/AST/ASTNodeTraverser.h index 151a9c6..3089658 100644 --- a/clang/include/clang/AST/ASTNodeTraverser.h +++ b/clang/include/clang/AST/ASTNodeTraverser.h @@ -644,8 +644,15 @@ public: } void VisitFriendDecl(const FriendDecl *D) { - if (!D->getFriendType()) + if (D->getFriendType()) { + // Traverse any CXXRecordDecl owned by this type, since + // it will not be in the parent context: + if (auto *ET = D->getFriendType()->getType()->getAs()) + if (auto *TD = ET->getOwnedTagDecl()) + Visit(TD); + } else { Visit(D->getFriendDecl()); + } } void VisitObjCMethodDecl(const ObjCMethodDecl *D) { diff --git a/clang/test/AST/ast-dump-decl.cpp b/clang/test/AST/ast-dump-decl.cpp index 61e7d9e..e22ea60 100644 --- a/clang/test/AST/ast-dump-decl.cpp +++ b/clang/test/AST/ast-dump-decl.cpp @@ -784,6 +784,7 @@ template class TestFriendDecl { // CHECK-NEXT: FriendDecl // CHECK-NEXT: FunctionDecl{{.*}} foo // CHECK-NEXT: FriendDecl{{.*}} 'class A':'A' +// CHECK-NEXT: CXXRecordDecl{{.*}} class A // CHECK-NEXT: FriendDecl{{.*}} 'T' namespace TestFileScopeAsmDecl { -- 2.7.4