royjacobson created this revision. Herald added a project: All. royjacobson requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
I accidentally broke friend destructor declarations in D130936 <https://reviews.llvm.org/D130936>. Fix it by checking that destructor names match the class name only for non-friends. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D131541 Files: clang/lib/Sema/SemaDecl.cpp clang/test/SemaCXX/member-class-11.cpp Index: clang/test/SemaCXX/member-class-11.cpp =================================================================== --- clang/test/SemaCXX/member-class-11.cpp +++ clang/test/SemaCXX/member-class-11.cpp @@ -26,4 +26,20 @@ ~B(); // expected-error {{expected the class name after '~' to name the enclosing class}} }; +template <typename T> +struct D { + friend T::S::~S(); +private: + static constexpr int secret = 42; +}; + +struct Q { + struct S { ~S(); }; +}; + +Q::S::~S() { + void foo(int); + foo(D<Q>::secret); +} + } Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -11515,15 +11515,17 @@ CheckConstructor(Constructor); } else if (CXXDestructorDecl *Destructor = dyn_cast<CXXDestructorDecl>(NewFD)) { - CXXRecordDecl *Record = Destructor->getParent(); - QualType ClassType = Context.getTypeDeclType(Record); - - DeclarationName Name = Context.DeclarationNames.getCXXDestructorName( - Context.getCanonicalType(ClassType)); - if (NewFD->getDeclName() != Name) { - Diag(NewFD->getLocation(), diag::err_destructor_name); - NewFD->setInvalidDecl(); - return Redeclaration; + if (NewFD->getFriendObjectKind() == Decl::FriendObjectKind::FOK_None) { + CXXRecordDecl *Record = Destructor->getParent(); + QualType ClassType = Context.getTypeDeclType(Record); + + DeclarationName Name = Context.DeclarationNames.getCXXDestructorName( + Context.getCanonicalType(ClassType)); + if (NewFD->getDeclName() != Name) { + Diag(NewFD->getLocation(), diag::err_destructor_name); + NewFD->setInvalidDecl(); + return Redeclaration; + } } } else if (auto *Guide = dyn_cast<CXXDeductionGuideDecl>(NewFD)) { if (auto *TD = Guide->getDescribedFunctionTemplate())
Index: clang/test/SemaCXX/member-class-11.cpp =================================================================== --- clang/test/SemaCXX/member-class-11.cpp +++ clang/test/SemaCXX/member-class-11.cpp @@ -26,4 +26,20 @@ ~B(); // expected-error {{expected the class name after '~' to name the enclosing class}} }; +template <typename T> +struct D { + friend T::S::~S(); +private: + static constexpr int secret = 42; +}; + +struct Q { + struct S { ~S(); }; +}; + +Q::S::~S() { + void foo(int); + foo(D<Q>::secret); +} + } Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -11515,15 +11515,17 @@ CheckConstructor(Constructor); } else if (CXXDestructorDecl *Destructor = dyn_cast<CXXDestructorDecl>(NewFD)) { - CXXRecordDecl *Record = Destructor->getParent(); - QualType ClassType = Context.getTypeDeclType(Record); - - DeclarationName Name = Context.DeclarationNames.getCXXDestructorName( - Context.getCanonicalType(ClassType)); - if (NewFD->getDeclName() != Name) { - Diag(NewFD->getLocation(), diag::err_destructor_name); - NewFD->setInvalidDecl(); - return Redeclaration; + if (NewFD->getFriendObjectKind() == Decl::FriendObjectKind::FOK_None) { + CXXRecordDecl *Record = Destructor->getParent(); + QualType ClassType = Context.getTypeDeclType(Record); + + DeclarationName Name = Context.DeclarationNames.getCXXDestructorName( + Context.getCanonicalType(ClassType)); + if (NewFD->getDeclName() != Name) { + Diag(NewFD->getLocation(), diag::err_destructor_name); + NewFD->setInvalidDecl(); + return Redeclaration; + } } } else if (auto *Guide = dyn_cast<CXXDeductionGuideDecl>(NewFD)) { if (auto *TD = Guide->getDescribedFunctionTemplate())
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits