[PATCH] D131541: [Sema] Fix friend destructor declarations after D130936
Roy Jacobson via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 9 22:48:19 PDT 2022
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())
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D131541.451356.patch
Type: text/x-patch
Size: 1947 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220810/5afed2d3/attachment-0001.bin>
More information about the cfe-commits
mailing list