[clang] [Clang][AST] fix crash in mangle lambda expression (PR #78896)

via cfe-commits cfe-commits at lists.llvm.org
Sun Jan 21 04:38:01 PST 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Qizhi Hu (jcsxky)

<details>
<summary>Changes</summary>

Try to fix [issue](https://github.com/llvm/llvm-project/issues/78542) by creating a new `FunctionTypeDepthState` and pop it after finish.

---
Full diff: https://github.com/llvm/llvm-project/pull/78896.diff


2 Files Affected:

- (modified) clang/lib/AST/ItaniumMangle.cpp (+2) 
- (added) clang/test/AST/mangle-lambda-expression-no-crash.cpp (+5) 


``````````diff
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index b1678479888eb77..20f1ec969155a8b 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -2128,6 +2128,7 @@ void CXXNameMangler::mangleLambda(const CXXRecordDecl *Lambda) {
 }
 
 void CXXNameMangler::mangleLambdaSig(const CXXRecordDecl *Lambda) {
+  FunctionTypeDepthState saved = FunctionTypeDepth.push();
   // Proposed on https://github.com/itanium-cxx-abi/cxx-abi/issues/31.
   for (auto *D : Lambda->getLambdaExplicitTemplateParameters())
     mangleTemplateParamDecl(D);
@@ -2140,6 +2141,7 @@ void CXXNameMangler::mangleLambdaSig(const CXXRecordDecl *Lambda) {
       Lambda->getLambdaTypeInfo()->getType()->castAs<FunctionProtoType>();
   mangleBareFunctionType(Proto, /*MangleReturnType=*/false,
                          Lambda->getLambdaStaticInvoker());
+  FunctionTypeDepth.pop(saved);
 }
 
 void CXXNameMangler::manglePrefix(NestedNameSpecifier *qualifier) {
diff --git a/clang/test/AST/mangle-lambda-expression-no-crash.cpp b/clang/test/AST/mangle-lambda-expression-no-crash.cpp
new file mode 100644
index 000000000000000..8727e99b9bf64dd
--- /dev/null
+++ b/clang/test/AST/mangle-lambda-expression-no-crash.cpp
@@ -0,0 +1,5 @@
+// RUN: %clang_cc1 -fsyntax-only -std=c++17 -verify %s
+// RUN: %clang_cc1 -fsyntax-only -std=c++20 -verify %s
+// expected-no-diagnostics
+
+auto ICE = [](auto a) { return [=]<decltype(a) b>() { return 1; }; };

``````````

</details>


https://github.com/llvm/llvm-project/pull/78896


More information about the cfe-commits mailing list