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 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
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 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits