https://github.com/Sirraide created https://github.com/llvm/llvm-project/pull/88428
This fixes a bug introduced by #84473: if a lambda’s type is type sugar (e.g. an `AttributedType`), we need to use `getAs()` instead of `cast()` to retrieve the `FunctionProtoType`. >From a66cded51aa55a998bc121a090187f049f97e527 Mon Sep 17 00:00:00 2001 From: Sirraide <aeternalm...@gmail.com> Date: Thu, 11 Apr 2024 21:42:10 +0200 Subject: [PATCH] [Clang] Look through type sugar when accessing FunctionProtoType --- clang/lib/Sema/SemaExpr.cpp | 2 +- clang/lib/Sema/SemaExprCXX.cpp | 2 +- clang/test/SemaCXX/cxx2b-deducing-this.cpp | 12 ++++++++++++ clang/test/SemaCXX/lambda-expressions.cpp | 9 +++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 45acbf197ea6b4..2d8b09df939db9 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -20743,7 +20743,7 @@ static void FixDependencyOfIdExpressionsInLambdaWithDependentObjectParameter( if (MD->getType().isNull()) continue; - const auto *Ty = cast<FunctionProtoType>(MD->getType()); + const auto *Ty = MD->getType()->getAs<FunctionProtoType>(); if (!Ty || !MD->isExplicitObjectMemberFunction() || !Ty->getParamType(0)->isDependentType()) continue; diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 9822477260e592..58b3607b2fdc43 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -1489,7 +1489,7 @@ void Sema::MarkThisReferenced(CXXThisExpr *This) { if (MD->getType().isNull()) return false; - const auto *Ty = cast<FunctionProtoType>(MD->getType()); + const auto *Ty = MD->getType()->getAs<FunctionProtoType>(); return Ty && MD->isExplicitObjectMemberFunction() && Ty->getParamType(0)->isDependentType(); } diff --git a/clang/test/SemaCXX/cxx2b-deducing-this.cpp b/clang/test/SemaCXX/cxx2b-deducing-this.cpp index c14c971afd2359..5f29a955e053c3 100644 --- a/clang/test/SemaCXX/cxx2b-deducing-this.cpp +++ b/clang/test/SemaCXX/cxx2b-deducing-this.cpp @@ -312,6 +312,18 @@ void TestMutationInLambda() { l1(); l2(); } + + // Check that we don't crash if the lambda has type sugar. + const auto l15 = [=](this auto&&) [[clang::annotate_type("foo")]] [[clang::annotate_type("bar")]] { + return x; + }; + + const auto l16 = [=]() [[clang::annotate_type("foo")]] [[clang::annotate_type("bar")]] { + return x; + }; + + l15(); + l16(); } struct Over_Call_Func_Example { diff --git a/clang/test/SemaCXX/lambda-expressions.cpp b/clang/test/SemaCXX/lambda-expressions.cpp index 151d74f21d64dc..6be338064452ed 100644 --- a/clang/test/SemaCXX/lambda-expressions.cpp +++ b/clang/test/SemaCXX/lambda-expressions.cpp @@ -762,3 +762,12 @@ template auto t::operator()<int>(int a) const; // expected-note {{in instantiati } #endif + +namespace GH84473_bug { +void f1() { + int b; + (void) [=] [[gnu::regcall]] () { // expected-warning {{an attribute specifier sequence in this position is a C++23 extension}} + (void) b; + }; +} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits