llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Eugene Velesevich (TabbySqui)

<details>
<summary>Changes</summary>

Mangle the original dependent expression to avoid mangling the function-context 
lambda.

For 'requires' and parameter exprs an original dependent expr is mangled. Thus 
now clang handles enable_if exprs in the same way.

Fixes #<!-- -->233807

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


2 Files Affected:

- (modified) clang/lib/AST/ItaniumMangle.cpp (+24-24) 
- (added) clang/test/CodeGenCXX/mangle-lambda-enable-if.cpp (+10) 


``````````diff
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 02f27cec53f69..73c5ed3f60613 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -908,30 +908,6 @@ void CXXNameMangler::mangleFunctionEncoding(GlobalDecl GD) 
{
 }
 
 void CXXNameMangler::mangleFunctionEncodingBareType(const FunctionDecl *FD) {
-  if (FD->hasAttr<EnableIfAttr>()) {
-    FunctionTypeDepthState Saved = FunctionTypeDepth.push();
-    Out << "Ua9enable_ifI";
-    for (AttrVec::const_iterator I = FD->getAttrs().begin(),
-                                 E = FD->getAttrs().end();
-         I != E; ++I) {
-      EnableIfAttr *EIA = dyn_cast<EnableIfAttr>(*I);
-      if (!EIA)
-        continue;
-      if (isCompatibleWith(LangOptions::ClangABI::Ver11)) {
-        // Prior to Clang 12, we hardcoded the X/E around enable-if's argument,
-        // even though <template-arg> should not include an X/E around
-        // <expr-primary>.
-        Out << 'X';
-        mangleExpression(EIA->getCond());
-        Out << 'E';
-      } else {
-        mangleTemplateArgExpr(EIA->getCond());
-      }
-    }
-    Out << 'E';
-    FunctionTypeDepth.pop(Saved);
-  }
-
   // When mangling an inheriting constructor, the bare function type used is
   // that of the inherited constructor.
   if (auto *CD = dyn_cast<CXXConstructorDecl>(FD))
@@ -964,6 +940,30 @@ void CXXNameMangler::mangleFunctionEncodingBareType(const 
FunctionDecl *FD) {
     FD = PrimaryTemplate->getTemplatedDecl();
   }
 
+  if (FD->hasAttr<EnableIfAttr>()) {
+    FunctionTypeDepthState Saved = FunctionTypeDepth.push();
+    Out << "Ua9enable_ifI";
+    for (AttrVec::const_iterator I = FD->getAttrs().begin(),
+                                 E = FD->getAttrs().end();
+         I != E; ++I) {
+      EnableIfAttr *EIA = dyn_cast<EnableIfAttr>(*I);
+      if (!EIA)
+        continue;
+      if (isCompatibleWith(LangOptions::ClangABI::Ver11)) {
+        // Prior to Clang 12, we hardcoded the X/E around enable-if's argument,
+        // even though <template-arg> should not include an X/E around
+        // <expr-primary>.
+        Out << 'X';
+        mangleExpression(EIA->getCond());
+        Out << 'E';
+      } else {
+        mangleTemplateArgExpr(EIA->getCond());
+      }
+    }
+    Out << 'E';
+    FunctionTypeDepth.pop(Saved);
+  }
+
   mangleBareFunctionType(FD->getType()->castAs<FunctionProtoType>(),
                          MangleReturnType, FD);
 }
diff --git a/clang/test/CodeGenCXX/mangle-lambda-enable-if.cpp 
b/clang/test/CodeGenCXX/mangle-lambda-enable-if.cpp
new file mode 100644
index 0000000000000..7fc3c31dc17d6
--- /dev/null
+++ b/clang/test/CodeGenCXX/mangle-lambda-enable-if.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -std=c++20 -emit-llvm %s -o - -triple x86_64-linux-gnu | 
FileCheck %s
+
+// Mangling a lambda in an enable_if condition must not recurse infinitely.
+// https://github.com/llvm/llvm-project/issues/233807
+template <int = 0>
+int get() __attribute__((enable_if([]() { return true; }(), ""))) { return 0; }
+
+// CHECK-LABEL: define {{.*}} @__cxx_global_var_init
+// CHECK: call {{.*}} @"_Z3getILi0EEUa9enable_ifIXclL3$_0EEEEiv"()
+int y = get();

``````````

</details>


https://github.com/llvm/llvm-project/pull/234915
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to