[clang] [Clang] Emit error for duplicate mangled names within a lambda (PR #107581)

Kerry McLaughlin via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 18 03:49:34 PDT 2024


https://github.com/kmclaughlin-arm updated https://github.com/llvm/llvm-project/pull/107581

>From 1e6f25c517d8d1adeeaf59f826141efdcad8f05a Mon Sep 17 00:00:00 2001
From: Kerry McLaughlin <kerry.mclaughlin at arm.com>
Date: Fri, 6 Sep 2024 10:13:33 +0000
Subject: [PATCH 1/5] [Clang] Emit error for duplicate mangled names within a
 lambda

When functions are passed as arguments to a lambda, it's possible for
the mangled names of these functions to be the same despite the prototypes
being different. For example:

  int non_streaming_fn(int);
  int streaming_fn(int) __arm_streaming;

  auto lambda_fn = [](const auto &f) { return f(); };
  return lambda_fn(non_streaming_fn) + lambda_fn(streaming_fn);

Only one function will be generated for the lambda above and the __arm_streaming
attribute from streaming_fn will be incorrectly applied to non_streaming_fn.
With this change, an error will be emitted when a duplicate mangled name is
found but the function prototypes do not match.
---
 clang/lib/CodeGen/CodeGenModule.cpp           | 35 ++++++++++++++-----
 .../aarch64-sme-lambda-attributes.cpp         | 28 +++++++++++++++
 2 files changed, 54 insertions(+), 9 deletions(-)
 create mode 100644 clang/test/CodeGenCXX/aarch64-sme-lambda-attributes.cpp

diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index df4c13c9ad97aa..b07090e3de6dfd 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -4638,8 +4638,8 @@ llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
   // Lookup the entry, lazily creating it if necessary.
   llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
   if (Entry) {
+    const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
     if (WeakRefReferences.erase(Entry)) {
-      const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
       if (FD && !FD->hasAttr<WeakAttr>())
         Entry->setLinkage(llvm::Function::ExternalLinkage);
     }
@@ -4652,18 +4652,35 @@ llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
 
     // If there are two attempts to define the same mangled name, issue an
     // error.
-    if (IsForDefinition && !Entry->isDeclaration()) {
-      GlobalDecl OtherGD;
-      // Check that GD is not yet in DiagnosedConflictingDefinitions is required
-      // to make sure that we issue an error only once.
-      if (lookupRepresentativeDecl(MangledName, OtherGD) &&
-          (GD.getCanonicalDecl().getDecl() !=
-           OtherGD.getCanonicalDecl().getDecl()) &&
-          DiagnosedConflictingDefinitions.insert(GD).second) {
+    GlobalDecl OtherGD;
+    // Check that GD is not yet in DiagnosedConflictingDefinitions is required
+    // to make sure that we issue an error only once.
+    if (GD && lookupRepresentativeDecl(MangledName, OtherGD) &&
+        (GD.getCanonicalDecl().getDecl() !=
+         OtherGD.getCanonicalDecl().getDecl()) &&
+        DiagnosedConflictingDefinitions.insert(GD).second) {
+      if (IsForDefinition && !Entry->isDeclaration()) {
         getDiags().Report(D->getLocation(), diag::err_duplicate_mangled_name)
             << MangledName;
         getDiags().Report(OtherGD.getDecl()->getLocation(),
                           diag::note_previous_definition);
+      } else {
+        // For lambdas, it's possible to create the same mangled name from
+        // different function prototypes. For example, two FPTs may have
+        // identical types but incompatible function attributes which we should
+        // not allow.
+        auto *MD = dyn_cast<CXXMethodDecl>(D);
+        if (MD && MD->getParent()->isLambda()) {
+          const FunctionDecl *OtherFD =
+              cast_or_null<FunctionDecl>(OtherGD.getDecl());
+          if (FD && FD->hasPrototype() && OtherFD && OtherFD->hasPrototype()) {
+            if (FD->getType()->getAs<FunctionProtoType>() !=
+                OtherFD->getType()->getAs<FunctionProtoType>())
+              getDiags().Report(D->getLocation(),
+                                diag::err_duplicate_mangled_name)
+                  << MangledName;
+          }
+        }
       }
     }
 
diff --git a/clang/test/CodeGenCXX/aarch64-sme-lambda-attributes.cpp b/clang/test/CodeGenCXX/aarch64-sme-lambda-attributes.cpp
new file mode 100644
index 00000000000000..bce3e657001679
--- /dev/null
+++ b/clang/test/CodeGenCXX/aarch64-sme-lambda-attributes.cpp
@@ -0,0 +1,28 @@
+// REQUIRES: aarch64-registered-target
+
+// RUN: %clang_cc1 -triple aarch64 -target-feature +sme -target-feature +sme2 -emit-llvm -o - %s -verify -DTEST1
+// RUN: %clang_cc1 -triple aarch64 -target-feature +sme -target-feature +sme2 -emit-llvm -o - %s -verify -DTEST2
+
+int normal_fn(int);
+int streaming_fn(int) __arm_streaming;
+int streaming_compatible_fn(int) __arm_streaming_compatible;
+
+#ifdef TEST1
+
+// expected-error at +2 {{definition with same mangled name '_ZZ32function_params_normal_streamingvENK3$_0clIFiiEEEDaRT_' as another definition}}
+int function_params_normal_streaming() {
+  auto a = [](auto &fn) { return fn(42); };
+  return a(normal_fn) + a(streaming_fn);
+}
+
+#endif
+
+#ifdef TEST2
+
+// expected-error at +2 {{definition with same mangled name '_ZZ36function_params_streaming_compatiblevENK3$_0clIFiiEEEDaRT_' as another definition}}
+int function_params_streaming_compatible() {
+  auto a = [](auto &fn) { return fn(42); };
+  return a(streaming_fn) + a(streaming_compatible_fn);
+}
+
+#endif

>From fc1394eec345702eea7f3c664e5fc33ce3c525d0 Mon Sep 17 00:00:00 2001
From: Kerry McLaughlin <kerry.mclaughlin at arm.com>
Date: Fri, 13 Sep 2024 08:58:02 +0000
Subject: [PATCH 2/5] - Rewrite changes to GetOrCreateLLVMFunction

---
 clang/lib/CodeGen/CodeGenModule.cpp           | 37 ++++++-------------
 .../aarch64-sme-lambda-attributes.cpp         |  6 ++-
 2 files changed, 15 insertions(+), 28 deletions(-)

diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index b07090e3de6dfd..e0cfbdf57534c7 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -4638,8 +4638,8 @@ llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
   // Lookup the entry, lazily creating it if necessary.
   llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
   if (Entry) {
-    const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
     if (WeakRefReferences.erase(Entry)) {
+      const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
       if (FD && !FD->hasAttr<WeakAttr>())
         Entry->setLinkage(llvm::Function::ExternalLinkage);
     }
@@ -4652,35 +4652,20 @@ llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
 
     // If there are two attempts to define the same mangled name, issue an
     // error.
-    GlobalDecl OtherGD;
-    // Check that GD is not yet in DiagnosedConflictingDefinitions is required
-    // to make sure that we issue an error only once.
-    if (GD && lookupRepresentativeDecl(MangledName, OtherGD) &&
-        (GD.getCanonicalDecl().getDecl() !=
-         OtherGD.getCanonicalDecl().getDecl()) &&
-        DiagnosedConflictingDefinitions.insert(GD).second) {
-      if (IsForDefinition && !Entry->isDeclaration()) {
+    auto *MD = dyn_cast_or_null<CXXMethodDecl>(D);
+    bool IsLambda = MD && MD->getParent()->isLambda();
+    if (IsForDefinition && (!Entry->isDeclaration() || IsLambda)) {
+      GlobalDecl OtherGD;
+      // Check that GD is not yet in DiagnosedConflictingDefinitions is required
+      // to make sure that we issue an error only once.
+      if (lookupRepresentativeDecl(MangledName, OtherGD) &&
+          (GD.getCanonicalDecl().getDecl() !=
+           OtherGD.getCanonicalDecl().getDecl()) &&
+          DiagnosedConflictingDefinitions.insert(GD).second) {
         getDiags().Report(D->getLocation(), diag::err_duplicate_mangled_name)
             << MangledName;
         getDiags().Report(OtherGD.getDecl()->getLocation(),
                           diag::note_previous_definition);
-      } else {
-        // For lambdas, it's possible to create the same mangled name from
-        // different function prototypes. For example, two FPTs may have
-        // identical types but incompatible function attributes which we should
-        // not allow.
-        auto *MD = dyn_cast<CXXMethodDecl>(D);
-        if (MD && MD->getParent()->isLambda()) {
-          const FunctionDecl *OtherFD =
-              cast_or_null<FunctionDecl>(OtherGD.getDecl());
-          if (FD && FD->hasPrototype() && OtherFD && OtherFD->hasPrototype()) {
-            if (FD->getType()->getAs<FunctionProtoType>() !=
-                OtherFD->getType()->getAs<FunctionProtoType>())
-              getDiags().Report(D->getLocation(),
-                                diag::err_duplicate_mangled_name)
-                  << MangledName;
-          }
-        }
       }
     }
 
diff --git a/clang/test/CodeGenCXX/aarch64-sme-lambda-attributes.cpp b/clang/test/CodeGenCXX/aarch64-sme-lambda-attributes.cpp
index bce3e657001679..d7667bf3343e75 100644
--- a/clang/test/CodeGenCXX/aarch64-sme-lambda-attributes.cpp
+++ b/clang/test/CodeGenCXX/aarch64-sme-lambda-attributes.cpp
@@ -9,7 +9,8 @@ int streaming_compatible_fn(int) __arm_streaming_compatible;
 
 #ifdef TEST1
 
-// expected-error at +2 {{definition with same mangled name '_ZZ32function_params_normal_streamingvENK3$_0clIFiiEEEDaRT_' as another definition}}
+// expected-error at +3 {{definition with same mangled name '_ZZ32function_params_normal_streamingvENK3$_0clIFiiEEEDaRT_' as another definition}}
+// expected-note at +2 {{previous definition is here}}
 int function_params_normal_streaming() {
   auto a = [](auto &fn) { return fn(42); };
   return a(normal_fn) + a(streaming_fn);
@@ -19,7 +20,8 @@ int function_params_normal_streaming() {
 
 #ifdef TEST2
 
-// expected-error at +2 {{definition with same mangled name '_ZZ36function_params_streaming_compatiblevENK3$_0clIFiiEEEDaRT_' as another definition}}
+// expected-error at +3 {{definition with same mangled name '_ZZ36function_params_streaming_compatiblevENK3$_0clIFiiEEEDaRT_' as another definition}}
+// expected-note at +2 {{previous definition is here}}
 int function_params_streaming_compatible() {
   auto a = [](auto &fn) { return fn(42); };
   return a(streaming_fn) + a(streaming_compatible_fn);

>From 33443e62afea03ebe22dd27ad2815f668b8da293 Mon Sep 17 00:00:00 2001
From: Kerry McLaughlin <kerry.mclaughlin at arm.com>
Date: Mon, 16 Sep 2024 10:54:03 +0000
Subject: [PATCH 3/5] - Removed second SME attributes test - Added a test using
 calling convention attributes

---
 .../aarch64-sme-lambda-attributes.cpp         | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/clang/test/CodeGenCXX/aarch64-sme-lambda-attributes.cpp b/clang/test/CodeGenCXX/aarch64-sme-lambda-attributes.cpp
index d7667bf3343e75..9e9a3d09de24fd 100644
--- a/clang/test/CodeGenCXX/aarch64-sme-lambda-attributes.cpp
+++ b/clang/test/CodeGenCXX/aarch64-sme-lambda-attributes.cpp
@@ -1,30 +1,31 @@
 // REQUIRES: aarch64-registered-target
 
-// RUN: %clang_cc1 -triple aarch64 -target-feature +sme -target-feature +sme2 -emit-llvm -o - %s -verify -DTEST1
+// RUN: %clang_cc1 -triple aarch64 -emit-llvm -o - %s -verify -DTEST1
 // RUN: %clang_cc1 -triple aarch64 -target-feature +sme -target-feature +sme2 -emit-llvm -o - %s -verify -DTEST2
 
 int normal_fn(int);
 int streaming_fn(int) __arm_streaming;
-int streaming_compatible_fn(int) __arm_streaming_compatible;
+int vector_pcs_fn(int) __attribute__((aarch64_vector_pcs));
 
 #ifdef TEST1
 
-// expected-error at +3 {{definition with same mangled name '_ZZ32function_params_normal_streamingvENK3$_0clIFiiEEEDaRT_' as another definition}}
-// expected-note at +2 {{previous definition is here}}
-int function_params_normal_streaming() {
+// expected-error at +4 {{definition with same mangled name '_ZZ23function_pcs_attributesvENK3$_0clIFiiEEEDaRT_' as another definition}}
+// expected-note at +3 {{previous definition is here}}
+__attribute__((aarch64_vector_pcs))
+int function_pcs_attributes() {
   auto a = [](auto &fn) { return fn(42); };
-  return a(normal_fn) + a(streaming_fn);
+  return a(normal_fn) + a(vector_pcs_fn);
 }
 
 #endif
 
 #ifdef TEST2
 
-// expected-error at +3 {{definition with same mangled name '_ZZ36function_params_streaming_compatiblevENK3$_0clIFiiEEEDaRT_' as another definition}}
+// expected-error at +3 {{definition with same mangled name '_ZZ32function_params_normal_streamingvENK3$_0clIFiiEEEDaRT_' as another definition}}
 // expected-note at +2 {{previous definition is here}}
-int function_params_streaming_compatible() {
+int function_params_normal_streaming() {
   auto a = [](auto &fn) { return fn(42); };
-  return a(streaming_fn) + a(streaming_compatible_fn);
+  return a(normal_fn) + a(streaming_fn);
 }
 
 #endif

>From 4b6d327fe6b6a552fe16e27f7b8b15ce5d2055da Mon Sep 17 00:00:00 2001
From: Kerry McLaughlin <kerry.mclaughlin at arm.com>
Date: Mon, 16 Sep 2024 16:22:41 +0000
Subject: [PATCH 4/5] - Renamed aarch64-sme-lambda-attributes.cpp to
 lambda-instantiation-mangling-conflicts.cpp - Replaced ifdefs in test with
 use of split-file

---
 ...mbda-instantiation-mangling-conflicts.cpp} | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)
 rename clang/test/CodeGenCXX/{aarch64-sme-lambda-attributes.cpp => lambda-instantiation-mangling-conflicts.cpp} (78%)

diff --git a/clang/test/CodeGenCXX/aarch64-sme-lambda-attributes.cpp b/clang/test/CodeGenCXX/lambda-instantiation-mangling-conflicts.cpp
similarity index 78%
rename from clang/test/CodeGenCXX/aarch64-sme-lambda-attributes.cpp
rename to clang/test/CodeGenCXX/lambda-instantiation-mangling-conflicts.cpp
index 9e9a3d09de24fd..433f616c8bb637 100644
--- a/clang/test/CodeGenCXX/aarch64-sme-lambda-attributes.cpp
+++ b/clang/test/CodeGenCXX/lambda-instantiation-mangling-conflicts.cpp
@@ -1,14 +1,16 @@
 // REQUIRES: aarch64-registered-target
 
-// RUN: %clang_cc1 -triple aarch64 -emit-llvm -o - %s -verify -DTEST1
-// RUN: %clang_cc1 -triple aarch64 -target-feature +sme -target-feature +sme2 -emit-llvm -o - %s -verify -DTEST2
+// RUN: rm -rf %t
+// RUN: split-file %s %t
+
+// RUN: %clang_cc1 -triple aarch64 -target-feature +sme -target-feature +sme2 -emit-llvm -o - %t/a.cpp -verify
+// RUN: %clang_cc1 -triple aarch64 -target-feature +sme -target-feature +sme2 -emit-llvm -o - %t/b.cpp -verify
+
+;--- a.cpp
 
 int normal_fn(int);
-int streaming_fn(int) __arm_streaming;
 int vector_pcs_fn(int) __attribute__((aarch64_vector_pcs));
 
-#ifdef TEST1
-
 // expected-error at +4 {{definition with same mangled name '_ZZ23function_pcs_attributesvENK3$_0clIFiiEEEDaRT_' as another definition}}
 // expected-note at +3 {{previous definition is here}}
 __attribute__((aarch64_vector_pcs))
@@ -17,9 +19,10 @@ int function_pcs_attributes() {
   return a(normal_fn) + a(vector_pcs_fn);
 }
 
-#endif
+;--- b.cpp
 
-#ifdef TEST2
+int normal_fn(int);
+int streaming_fn(int) __arm_streaming;
 
 // expected-error at +3 {{definition with same mangled name '_ZZ32function_params_normal_streamingvENK3$_0clIFiiEEEDaRT_' as another definition}}
 // expected-note at +2 {{previous definition is here}}
@@ -27,5 +30,3 @@ int function_params_normal_streaming() {
   auto a = [](auto &fn) { return fn(42); };
   return a(normal_fn) + a(streaming_fn);
 }
-
-#endif

>From 00e7b0494c831b3f7405d34fa9819a271b77eb50 Mon Sep 17 00:00:00 2001
From: Kerry McLaughlin <kerry.mclaughlin at arm.com>
Date: Tue, 15 Oct 2024 15:37:56 +0000
Subject: [PATCH 5/5] - Moved error to EmitGlobal and removed specific check
 for a lambda

---
 clang/lib/CodeGen/CodeGenModule.cpp           | 21 +++++++++++++------
 ...ambda-instantiation-mangling-conflicts.cpp |  6 ++----
 .../CodeGenCXX/mangle-lambdas-gh88906.cpp     |  9 ++------
 3 files changed, 19 insertions(+), 17 deletions(-)

diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index e0cfbdf57534c7..550454abdd1ef2 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -3911,9 +3911,20 @@ void CodeGenModule::EmitGlobal(GlobalDecl GD) {
     assert(!MayBeEmittedEagerly(Global));
     addDeferredDeclToEmit(GD);
   } else {
-    // Otherwise, remember that we saw a deferred decl with this name.  The
-    // first use of the mangled name will cause it to move into
-    // DeferredDeclsToEmit.
+    // Otherwise, remember that we saw a deferred decl with this name.
+    auto DDI = DeferredDecls.find(MangledName);
+    const auto *FD = dyn_cast<FunctionDecl>(Global);
+    if (FD && DDI != DeferredDecls.end()) {
+      bool IsDefinitionAvailableExternally =
+          getContext().GetGVALinkageForFunction(FD) == GVA_AvailableExternally;
+      if (!IsDefinitionAvailableExternally && !FD->isMultiVersion() &&
+          !FD->hasAttr<OMPDeclareTargetDeclAttr>())
+        getDiags().Report(Global->getLocation(),
+                          diag::err_duplicate_mangled_name)
+            << MangledName;
+    }
+    // The first use of the mangled name will cause it to move
+    // into DeferredDeclsToEmit.
     DeferredDecls[MangledName] = GD;
   }
 }
@@ -4652,9 +4663,7 @@ llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
 
     // If there are two attempts to define the same mangled name, issue an
     // error.
-    auto *MD = dyn_cast_or_null<CXXMethodDecl>(D);
-    bool IsLambda = MD && MD->getParent()->isLambda();
-    if (IsForDefinition && (!Entry->isDeclaration() || IsLambda)) {
+    if (IsForDefinition && !Entry->isDeclaration()) {
       GlobalDecl OtherGD;
       // Check that GD is not yet in DiagnosedConflictingDefinitions is required
       // to make sure that we issue an error only once.
diff --git a/clang/test/CodeGenCXX/lambda-instantiation-mangling-conflicts.cpp b/clang/test/CodeGenCXX/lambda-instantiation-mangling-conflicts.cpp
index 433f616c8bb637..3a5adc5cb7c7d0 100644
--- a/clang/test/CodeGenCXX/lambda-instantiation-mangling-conflicts.cpp
+++ b/clang/test/CodeGenCXX/lambda-instantiation-mangling-conflicts.cpp
@@ -11,8 +11,7 @@
 int normal_fn(int);
 int vector_pcs_fn(int) __attribute__((aarch64_vector_pcs));
 
-// expected-error at +4 {{definition with same mangled name '_ZZ23function_pcs_attributesvENK3$_0clIFiiEEEDaRT_' as another definition}}
-// expected-note at +3 {{previous definition is here}}
+// expected-error at +3 {{definition with same mangled name '_ZZ23function_pcs_attributesvENK3$_0clIFiiEEEDaRT_' as another definition}}
 __attribute__((aarch64_vector_pcs))
 int function_pcs_attributes() {
   auto a = [](auto &fn) { return fn(42); };
@@ -24,8 +23,7 @@ int function_pcs_attributes() {
 int normal_fn(int);
 int streaming_fn(int) __arm_streaming;
 
-// expected-error at +3 {{definition with same mangled name '_ZZ32function_params_normal_streamingvENK3$_0clIFiiEEEDaRT_' as another definition}}
-// expected-note at +2 {{previous definition is here}}
+// expected-error at +2 {{definition with same mangled name '_ZZ32function_params_normal_streamingvENK3$_0clIFiiEEEDaRT_' as another definition}}
 int function_params_normal_streaming() {
   auto a = [](auto &fn) { return fn(42); };
   return a(normal_fn) + a(streaming_fn);
diff --git a/clang/test/CodeGenCXX/mangle-lambdas-gh88906.cpp b/clang/test/CodeGenCXX/mangle-lambdas-gh88906.cpp
index e7592cec5da776..6130756af0e618 100644
--- a/clang/test/CodeGenCXX/mangle-lambdas-gh88906.cpp
+++ b/clang/test/CodeGenCXX/mangle-lambdas-gh88906.cpp
@@ -1,5 +1,5 @@
 // RUN: %clang_cc1 -triple x86_64-linux-gnu %s -emit-llvm -mconstructor-aliases -o - | FileCheck %s
-// RUN: %clang_cc1 -triple x86_64-linux-gnu -fclang-abi-compat=18 %s -emit-llvm -mconstructor-aliases  -o - | FileCheck --check-prefix=CLANG18 %s
+// RUN: not %clang_cc1 -triple x86_64-linux-gnu -fclang-abi-compat=18 %s -emit-llvm -mconstructor-aliases 2>&1 | FileCheck --check-prefix=CLANG18 %s
 // RUN: %clang_cc1 -triple i386-pc-win32 %s -emit-llvm -mconstructor-aliases -o - | FileCheck --check-prefix=MSABI %s
 
 
@@ -29,12 +29,7 @@ void GH88906(){
 // CHECK-LABEL: define internal void @_ZN4funcC2IN7GH889064Test1bMUlvE_EEET_
 // CHECK-LABEL: define internal void @_ZN4funcC2IN7GH889064Test1cMUlvE_EEET_
 
-// CLANG18-LABEL: define internal void @_ZZ7GH88906vEN4TestC2Ev
-// CLANG18: call void @_ZN4funcC2IZ7GH88906vEN4TestUlvE_EZ7GH88906vENS1_UlvE0_EEET_T0_
-// CLANG18: call void @_ZN4funcC2IZ7GH88906vEN4TestUlvE_EEET_
-// CLANG18: call void @_ZN4funcC2IZ7GH88906vEN4TestUlvE_EEET_
-
-
+// CLANG18: error: definition with same mangled name '_ZN4funcC1IZ7GH88906vEN4TestUlvE_EEET_' as another definition
 
 // MSABI-LABEL: define internal x86_thiscallcc noundef ptr @"??0Test@?1??GH88906@@YAXXZ at QAE@XZ"
 // MSABI: call x86_thiscallcc noundef ptr @"??$?0V<lambda_1>@a at Test@?1??GH88906@@YAXXZ at V<lambda_2>@12?1??3 at YAXXZ@@func@@QAE at V<lambda_1>@a at Test@?1??GH88906@@YAXXZ at V<lambda_2>@23?1??4 at YAXXZ@@Z"



More information about the cfe-commits mailing list