[clang] [clang][bytecode] Move generic lambda handling to Compiler (PR #159733)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 19 02:22:39 PDT 2025
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/159733
So the static invoker's Function still points to the static invoker instead of the call operator of the lambda record. This is important for a later commit.
>From 447077a9185fe31bedf78293a2037942a07625cf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Fri, 19 Sep 2025 11:08:24 +0200
Subject: [PATCH] [clang][bytecode] Move generic lambda handling to Compiler
So the static invoker's Function still points to the static invoker
instead of the call operator of the lambda record. This is important for
a later commit.
---
clang/lib/AST/ByteCode/Compiler.cpp | 19 ++++++++++++++++++-
clang/lib/AST/ByteCode/Context.cpp | 17 -----------------
2 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index 1340a84a7d44d..fafec47f7de3c 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -6077,7 +6077,24 @@ bool Compiler<Emitter>::emitLambdaStaticInvokerBody(const CXXMethodDecl *MD) {
assert(cast<CompoundStmt>(MD->getBody())->body_empty());
const CXXRecordDecl *ClosureClass = MD->getParent();
- const CXXMethodDecl *LambdaCallOp = ClosureClass->getLambdaCallOperator();
+ const FunctionDecl *LambdaCallOp;
+ assert(ClosureClass->captures().empty());
+ if (ClosureClass->isGenericLambda()) {
+ LambdaCallOp = ClosureClass->getLambdaCallOperator();
+ assert(MD->isFunctionTemplateSpecialization() &&
+ "A generic lambda's static-invoker function must be a "
+ "template specialization");
+ const TemplateArgumentList *TAL = MD->getTemplateSpecializationArgs();
+ FunctionTemplateDecl *CallOpTemplate =
+ LambdaCallOp->getDescribedFunctionTemplate();
+ void *InsertPos = nullptr;
+ const FunctionDecl *CorrespondingCallOpSpecialization =
+ CallOpTemplate->findSpecialization(TAL->asArray(), InsertPos);
+ assert(CorrespondingCallOpSpecialization);
+ LambdaCallOp = CorrespondingCallOpSpecialization;
+ } else {
+ LambdaCallOp = ClosureClass->getLambdaCallOperator();
+ }
assert(ClosureClass->captures().empty());
const Function *Func = this->getFunction(LambdaCallOp);
if (!Func)
diff --git a/clang/lib/AST/ByteCode/Context.cpp b/clang/lib/AST/ByteCode/Context.cpp
index 6e6c60925a70f..22ae64ede2f1c 100644
--- a/clang/lib/AST/ByteCode/Context.cpp
+++ b/clang/lib/AST/ByteCode/Context.cpp
@@ -465,23 +465,6 @@ const Function *Context::getOrCreateFunction(const FunctionDecl *FuncDecl) {
// be a non-static member function, this (usually) requiring an
// instance pointer. We suppress that later in this function.
IsLambdaStaticInvoker = true;
-
- const CXXRecordDecl *ClosureClass = MD->getParent();
- assert(ClosureClass->captures().empty());
- if (ClosureClass->isGenericLambda()) {
- const CXXMethodDecl *LambdaCallOp = ClosureClass->getLambdaCallOperator();
- assert(MD->isFunctionTemplateSpecialization() &&
- "A generic lambda's static-invoker function must be a "
- "template specialization");
- const TemplateArgumentList *TAL = MD->getTemplateSpecializationArgs();
- FunctionTemplateDecl *CallOpTemplate =
- LambdaCallOp->getDescribedFunctionTemplate();
- void *InsertPos = nullptr;
- const FunctionDecl *CorrespondingCallOpSpecialization =
- CallOpTemplate->findSpecialization(TAL->asArray(), InsertPos);
- assert(CorrespondingCallOpSpecialization);
- FuncDecl = CorrespondingCallOpSpecialization;
- }
}
// Set up argument indices.
unsigned ParamOffset = 0;
More information about the cfe-commits
mailing list