[PATCH] D130936: [SemaCXX] Validate destructor is valid for dependent classes
Roy Jacobson via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 2 11:51:10 PDT 2022
This revision was automatically updated to reflect the committed changes.
Closed by commit rG508c431ed9ab: [SemaCXX] Validate destructor is valid for dependent classes (authored by royjacobson).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D130936/new/
https://reviews.llvm.org/D130936
Files:
clang/docs/ReleaseNotes.rst
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
@@ -1,4 +1,6 @@
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s
struct rdar9677163 {
struct Y { ~Y(); };
@@ -6,3 +8,22 @@
Y::~Y() { } // expected-error{{non-friend class member '~Y' cannot have a qualified name}}
~Z(); // expected-error{{expected the class name after '~' to name the enclosing class}}
};
+
+namespace GH56772 {
+
+template<class T>
+struct A {
+ ~A<T>();
+};
+#if __cplusplus >= 202002L
+// FIXME: This isn't valid in C++20 and later.
+#endif
+
+struct B;
+
+template<class T>
+struct C {
+ ~B(); // expected-error {{expected the class name after '~' to name the enclosing class}}
+};
+
+}
Index: clang/lib/Sema/SemaDecl.cpp
===================================================================
--- clang/lib/Sema/SemaDecl.cpp
+++ clang/lib/Sema/SemaDecl.cpp
@@ -11496,17 +11496,12 @@
CXXRecordDecl *Record = Destructor->getParent();
QualType ClassType = Context.getTypeDeclType(Record);
- // FIXME: Shouldn't we be able to perform this check even when the class
- // type is dependent? Both gcc and edg can handle that.
- if (!ClassType->isDependentType()) {
- DeclarationName Name
- = Context.DeclarationNames.getCXXDestructorName(
- Context.getCanonicalType(ClassType));
- if (NewFD->getDeclName() != Name) {
- Diag(NewFD->getLocation(), diag::err_destructor_name);
- NewFD->setInvalidDecl();
- return Redeclaration;
- }
+ 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/docs/ReleaseNotes.rst
===================================================================
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -52,6 +52,8 @@
- Fixes an accepts-invalid bug in C when using a ``_Noreturn`` function
specifier on something other than a function declaration. This fixes
`Issue 56800 <https://github.com/llvm/llvm-project/issues/56800>`_.
+- Fix `#56772 <https://github.com/llvm/llvm-project/issues/56772>`_ - invalid
+ destructor names were incorrectly accepted on template classes.
Improvements to Clang's diagnostics
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D130936.449370.patch
Type: text/x-patch
Size: 2864 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220802/57077a88/attachment-0001.bin>
More information about the cfe-commits
mailing list