Skip to content

Commit

Permalink
[Clang] Fix evaluation of parameters of lambda call operator attributes
Browse files Browse the repository at this point in the history
Fix a regresion introduced by D124351.
Attributes of lambda call operator were evaluated in the
context of the closure object type rather than its operator,
causing an assertion failure.

This was because we temporarily switch to the class lambda to
produce the mangling of the lambda, but we stayed in that
context too long.

Reviewed By: eandrews, aaron.ballman

Differential Revision: https://reviews.llvm.org/D146535
  • Loading branch information
cor3ntin committed Mar 23, 2023
1 parent 5bcb4c4 commit 82c83d7
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 5 deletions.
7 changes: 3 additions & 4 deletions clang/lib/Sema/SemaLambda.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,9 @@ buildTypeForLambdaCallOperator(Sema &S, clang::CXXRecordDecl *Class,
void Sema::handleLambdaNumbering(
CXXRecordDecl *Class, CXXMethodDecl *Method,
std::optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling) {

ContextRAII ManglingContext(*this, Class->getDeclContext());

if (Mangling) {
bool HasKnownInternalLinkage;
unsigned ManglingNumber, DeviceManglingNumber;
Expand Down Expand Up @@ -1324,8 +1327,6 @@ void Sema::ActOnStartOfLambdaDefinition(LambdaIntroducer &Intro,
ParamInfo.getDeclSpec().getConstexprSpecifier(),
IsLambdaStatic ? SC_Static : SC_None, Params, ExplicitResultType);

ContextRAII ManglingContext(*this, Class->getDeclContext());

CheckCXXDefaultArguments(Method);

// This represents the function body for the lambda function, check if we
Expand All @@ -1350,8 +1351,6 @@ void Sema::ActOnStartOfLambdaDefinition(LambdaIntroducer &Intro,

handleLambdaNumbering(Class, Method);

ManglingContext.pop();

for (auto &&C : LSI->Captures) {
if (!C.isVariableCapture())
continue;
Expand Down
12 changes: 11 additions & 1 deletion clang/test/SemaCXX/lambda-expressions.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// RUN: %clang_cc1 -std=c++14 -Wno-unused-value -fsyntax-only -verify -verify=expected-cxx14 -fblocks %s
// RUN: %clang_cc1 -std=c++17 -Wno-unused-value -fsyntax-only -verify -fblocks %s
// RUN: %clang_cc1 -std=c++17 -Wno-unused-value -verify -ast-dump -fblocks %s | FileCheck %s

namespace std { class type_info; };

Expand Down Expand Up @@ -704,3 +704,13 @@ static_assert([]() constexpr {
}());
} // namespace GH60936
#endif

// Call operator attributes refering to a variable should
// be properly handled after D124351
constexpr int i = 2;
void foo() {
(void)[=][[gnu::aligned(i)]] () {}; // expected-warning{{C++2b extension}}
// CHECK: AlignedAttr
// CHECK-NEXT: ConstantExpr
// CHECK-NEXT: value: Int 2
}

0 comments on commit 82c83d7

Please sign in to comment.