https://github.com/Endilll updated https://github.com/llvm/llvm-project/pull/98622
>From 5310764fb4044bcd4229434e80b64870c4b4ee8c Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Fri, 12 Jul 2024 15:12:37 +0300 Subject: [PATCH 1/4] [clang] Fix crash in concept deprecation Apparently we can't assume that `AutoTypeLoc` from `AutoType` is always valid. Fixes #98164 --- clang/lib/Sema/SemaDecl.cpp | 9 +++++---- clang/lib/Sema/SemaType.cpp | 10 +++++----- clang/test/SemaCXX/cxx-deprecated.cpp | 7 +++++++ 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 66eeaa8e6f777..7e4328cc176a2 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -7416,10 +7416,11 @@ NamedDecl *Sema::ActOnVariableDeclarator( tryToFixVariablyModifiedVarType(TInfo, R, D.getIdentifierLoc(), /*DiagID=*/0); - if (const AutoType *AutoT = R->getAs<AutoType>()) - CheckConstrainedAuto( - AutoT, - TInfo->getTypeLoc().getContainedAutoTypeLoc().getConceptNameLoc()); + if (const AutoType *AutoT = R->getAs<AutoType>()) { + AutoTypeLoc Loc = TInfo->getTypeLoc().getContainedAutoTypeLoc(); + CheckConstrainedAuto(AutoT, + Loc ? Loc.getConceptNameLoc() : SourceLocation()); + } bool IsMemberSpecialization = false; bool IsVariableTemplateSpecialization = false; diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 714409f927a8d..887d1b395d475 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -6308,11 +6308,11 @@ TypeResult Sema::ActOnTypeName(Declarator &D) { CheckExtraCXXDefaultArguments(D); } - if (const AutoType *AutoT = T->getAs<AutoType>()) - CheckConstrainedAuto( - AutoT, - TInfo->getTypeLoc().getContainedAutoTypeLoc().getConceptNameLoc()); - + if (const AutoType *AutoT = T->getAs<AutoType>()) { + AutoTypeLoc Loc = TInfo->getTypeLoc().getContainedAutoTypeLoc(); + CheckConstrainedAuto(AutoT, + Loc ? Loc.getConceptNameLoc() : SourceLocation()); + } return CreateParsedType(T, TInfo); } diff --git a/clang/test/SemaCXX/cxx-deprecated.cpp b/clang/test/SemaCXX/cxx-deprecated.cpp index 81eb07608300d..870930f54af72 100644 --- a/clang/test/SemaCXX/cxx-deprecated.cpp +++ b/clang/test/SemaCXX/cxx-deprecated.cpp @@ -36,4 +36,11 @@ template <C T> // expected-warning@-1 {{'C' is deprecated}} // expected-note@#C {{'C' has been explicitly marked deprecated here}} void f(); + +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 cxx20_concept >From 126057f778254ecc071a24fed93c0cbf28f4f0de Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Wed, 17 Jul 2024 17:58:07 +0300 Subject: [PATCH 2/4] Apply suggestion from @mizvekov --- clang/lib/Sema/SemaDecl.cpp | 7 +++---- clang/test/CXX/drs/cwg24xx.cpp | 9 +++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 7e4328cc176a2..c2a6377ee19d1 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -7416,10 +7416,9 @@ NamedDecl *Sema::ActOnVariableDeclarator( tryToFixVariablyModifiedVarType(TInfo, R, D.getIdentifierLoc(), /*DiagID=*/0); - if (const AutoType *AutoT = R->getAs<AutoType>()) { - AutoTypeLoc Loc = TInfo->getTypeLoc().getContainedAutoTypeLoc(); - CheckConstrainedAuto(AutoT, - Loc ? Loc.getConceptNameLoc() : SourceLocation()); + if (AutoTypeLoc TL = TInfo->getTypeLoc().getContainedAutoTypeLoc()) { + const AutoType *AT = TL.getTypePtr(); + CheckConstrainedAuto(AT, TL.getConceptNameLoc()); } bool IsMemberSpecialization = false; 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 >From 270b9fc1f1cbb089e4e208c172fcde3881df8720 Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Wed, 17 Jul 2024 22:00:23 +0300 Subject: [PATCH 3/4] Fix `ActOnTypeName` --- clang/lib/Sema/SemaType.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 887d1b395d475..6e968f1802817 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -6308,10 +6308,9 @@ TypeResult Sema::ActOnTypeName(Declarator &D) { CheckExtraCXXDefaultArguments(D); } - if (const AutoType *AutoT = T->getAs<AutoType>()) { - AutoTypeLoc Loc = TInfo->getTypeLoc().getContainedAutoTypeLoc(); - CheckConstrainedAuto(AutoT, - Loc ? Loc.getConceptNameLoc() : SourceLocation()); + if (AutoTypeLoc TL = TInfo->getTypeLoc().getContainedAutoTypeLoc()) { + const AutoType *AT = TL.getTypePtr(); + CheckConstrainedAuto(AT, TL.getConceptNameLoc()); } return CreateParsedType(T, TInfo); } >From 0a048595f80af495be375c6b45c2103cacf32a9a Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Thu, 18 Jul 2024 11:13:08 +0300 Subject: [PATCH 4/4] Wrap test case from the issue into a namespace --- clang/test/SemaCXX/cxx-deprecated.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clang/test/SemaCXX/cxx-deprecated.cpp b/clang/test/SemaCXX/cxx-deprecated.cpp index 870930f54af72..d7de609d58cdd 100644 --- a/clang/test/SemaCXX/cxx-deprecated.cpp +++ b/clang/test/SemaCXX/cxx-deprecated.cpp @@ -37,10 +37,12 @@ template <C T> // 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