Author: Vlad Serebrennikov Date: 2024-07-18T19:29:51+04:00 New Revision: 2bdcfbe62cb9a08df4b58a17d44be0a3082df053
URL: https://github.com/llvm/llvm-project/commit/2bdcfbe62cb9a08df4b58a17d44be0a3082df053 DIFF: https://github.com/llvm/llvm-project/commit/2bdcfbe62cb9a08df4b58a17d44be0a3082df053.diff LOG: [clang] Fix crash in concept deprecation (#98622) There is a gap between `getAs<AutoType>()` and `getConstrainedAutoType()` that the original patch #92295 was not aware of. Fixes #98164 Added: Modified: clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaType.cpp clang/test/CXX/drs/cwg24xx.cpp clang/test/SemaCXX/cxx-deprecated.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 6c3589bf87433..bb25a0b3a45ae 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -7436,10 +7436,10 @@ NamedDecl *Sema::ActOnVariableDeclarator( tryToFixVariablyModifiedVarType(TInfo, R, D.getIdentifierLoc(), /*DiagID=*/0); - if (const AutoType *AutoT = R->getAs<AutoType>()) - CheckConstrainedAuto( - AutoT, - TInfo->getTypeLoc().getContainedAutoTypeLoc().getConceptNameLoc()); + if (AutoTypeLoc TL = TInfo->getTypeLoc().getContainedAutoTypeLoc()) { + const AutoType *AT = TL.getTypePtr(); + CheckConstrainedAuto(AT, TL.getConceptNameLoc()); + } bool IsMemberSpecialization = false; bool IsVariableTemplateSpecialization = false; diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index baac1fe4f2407..6fa39cdccef2b 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -6363,11 +6363,10 @@ TypeResult Sema::ActOnTypeName(Declarator &D) { CheckExtraCXXDefaultArguments(D); } - if (const AutoType *AutoT = T->getAs<AutoType>()) - CheckConstrainedAuto( - AutoT, - TInfo->getTypeLoc().getContainedAutoTypeLoc().getConceptNameLoc()); - + if (AutoTypeLoc TL = TInfo->getTypeLoc().getContainedAutoTypeLoc()) { + const AutoType *AT = TL.getTypePtr(); + CheckConstrainedAuto(AT, TL.getConceptNameLoc()); + } return CreateParsedType(T, TInfo); } diff --git a/clang/test/CXX/drs/cwg24xx.cpp b/clang/test/CXX/drs/cwg24xx.cpp index 16b8ec07fc50f..00b6bb5a865df 100644 --- a/clang/test/CXX/drs/cwg24xx.cpp +++ b/clang/test/CXX/drs/cwg24xx.cpp @@ -82,6 +82,15 @@ auto h() -> C auto { C auto foo = T(); // expected-warning@-1 {{'C' is deprecated}} // expected-note@#cwg2428-C {{'C' has been explicitly marked deprecated here}} + C auto *bar = T(); + // expected-warning@-1 {{'C' is deprecated}} + // expected-note@#cwg2428-C {{'C' has been explicitly marked deprecated here}} + C auto &baz = T(); + // expected-warning@-1 {{'C' is deprecated}} + // expected-note@#cwg2428-C {{'C' has been explicitly marked deprecated here}} + C auto &&quux = T(); + // expected-warning@-1 {{'C' is deprecated}} + // expected-note@#cwg2428-C {{'C' has been explicitly marked deprecated here}} return foo; } #endif diff --git a/clang/test/SemaCXX/cxx-deprecated.cpp b/clang/test/SemaCXX/cxx-deprecated.cpp index 81eb07608300d..d7de609d58cdd 100644 --- a/clang/test/SemaCXX/cxx-deprecated.cpp +++ b/clang/test/SemaCXX/cxx-deprecated.cpp @@ -36,4 +36,13 @@ template <C T> // expected-warning@-1 {{'C' is deprecated}} // expected-note@#C {{'C' has been explicitly marked deprecated here}} void f(); + +namespace GH98164 { +template <int> +auto b() = delete; // #b + +decltype(b<0>()) x; +// expected-error@-1 {{call to deleted function 'b'}} +// expected-note@#b {{candidate function [with $0 = 0] has been explicitly deleted}} +} // namespace GH98164 } // namespace cxx20_concept _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits