llvm-project
8ce2b9cb - [Clang][ItaniumMangle] Fix recursive mangling for lambda init-captures (#182667)

Commit
77 days ago
[Clang][ItaniumMangle] Fix recursive mangling for lambda init-captures (#182667) [Clang][ItaniumMangle] Fix recursive mangling for lambda init-captures Mangle computation for lambda signatures can recurse when a call operator type references an init-capture (for example via decltype(init-capture)). In these cases, mangling can re-enter the init-capture declaration and cycle back through operator() mangling. Make lambda context publication explicit and independent from numbering state, then use that context uniformly during mangling: * Publish lambda `ContextDecl` in `Sema::handleLambdaNumbering()` before numbering, so dependent type mangling can resolve the lambda context without recursing through the call operator. * Introduce `CXXRecordDecl::setLambdaContextDecl()` and remove `ContextDecl` from `CXXRecordDecl::LambdaNumbering`. * Update `ASTImporter` to import/set lambda context separately from numbering. * In Itanium mangling, derive init-capture handling from context computation: - map local-lambda init-captures to the enclosing local context in `getEffectiveDeclContext()` - support init-capture variables in `getClosurePrefix()` - keep `mangleLocalName()` generic and rely on the computed context Add mangling regression coverage in mangle-lambdas.cpp, including: * local init-captures used through decltype * non-local variable-template init-captures in decltype * non-local static inline member init-captures in decltype * Fixes https://github.com/llvm/llvm-project/issues/63271 * Fixes https://github.com/llvm/llvm-project/issues/86240 * Fixes https://github.com/llvm/llvm-project/issues/139089
Author
Parents
Loading