sammccall created this revision. sammccall added a reviewer: hokein. Herald added a project: All. sammccall requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D141362 Files: clang/include/clang/AST/ASTNodeTraverser.h clang/test/AST/ast-dump-decl.cpp Index: clang/test/AST/ast-dump-decl.cpp =================================================================== --- clang/test/AST/ast-dump-decl.cpp +++ clang/test/AST/ast-dump-decl.cpp @@ -784,6 +784,7 @@ // CHECK-NEXT: FriendDecl // CHECK-NEXT: FunctionDecl{{.*}} foo // CHECK-NEXT: FriendDecl{{.*}} 'class A':'A' +// CHECK-NEXT: CXXRecordDecl{{.*}} class A // CHECK-NEXT: FriendDecl{{.*}} 'T' namespace TestFileScopeAsmDecl { Index: clang/include/clang/AST/ASTNodeTraverser.h =================================================================== --- clang/include/clang/AST/ASTNodeTraverser.h +++ clang/include/clang/AST/ASTNodeTraverser.h @@ -644,8 +644,15 @@ } 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<ElaboratedType>()) + if (auto *TD = ET->getOwnedTagDecl()) + Visit(TD); + } else { Visit(D->getFriendDecl()); + } } void VisitObjCMethodDecl(const ObjCMethodDecl *D) {
Index: clang/test/AST/ast-dump-decl.cpp =================================================================== --- clang/test/AST/ast-dump-decl.cpp +++ clang/test/AST/ast-dump-decl.cpp @@ -784,6 +784,7 @@ // CHECK-NEXT: FriendDecl // CHECK-NEXT: FunctionDecl{{.*}} foo // CHECK-NEXT: FriendDecl{{.*}} 'class A':'A' +// CHECK-NEXT: CXXRecordDecl{{.*}} class A // CHECK-NEXT: FriendDecl{{.*}} 'T' namespace TestFileScopeAsmDecl { Index: clang/include/clang/AST/ASTNodeTraverser.h =================================================================== --- clang/include/clang/AST/ASTNodeTraverser.h +++ clang/include/clang/AST/ASTNodeTraverser.h @@ -644,8 +644,15 @@ } 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<ElaboratedType>()) + if (auto *TD = ET->getOwnedTagDecl()) + Visit(TD); + } else { Visit(D->getFriendDecl()); + } } void VisitObjCMethodDecl(const ObjCMethodDecl *D) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits