Skip to content

Commit 7da92af

Browse files
committed
Itanium Mangling: Fix handling of <expr-primary> in <template-arg>.
Previously, we were emitting an extraneous X .. E in <template-arg> around an <expr-primary> if the template argument was constructed from an expression (rather than an already-evaluated literal value). In such a case, we would then e.g. emit 'XLi0EE' instead of 'Li0E'. We had one special-case for DeclRefExpr expressions, in particular, to omit them the mangled-name without the surrounding X/E. However, unfortunately, that special case also triggered for ParmVarDecl (a subtype of VarDecl), and _incorrectly_ emitted 'L_Z .. E' instead of the proper 'Xfp_E'. This change causes mangleExpression itself to be responsible for emitting X/E around non-primary expressions, which removes the special-case, and corrects both these problems. Differential Revision: https://reviews.llvm.org/D95487 (cherry picked from commit 8ca3360)
1 parent b0085d2 commit 7da92af

8 files changed

+259
-92
lines changed

clang/lib/AST/ItaniumMangle.cpp

Lines changed: 158 additions & 65 deletions
Large diffs are not rendered by default.

clang/test/CodeGenCXX/clang-abi-compat.cpp

Lines changed: 85 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,23 @@
1-
// RUN: %clang_cc1 -std=c++98 -triple x86_64-linux-gnu -fclang-abi-compat=3.0 %s -emit-llvm -o - | FileCheck --check-prefixes=CHECK,PRE39,PRE5,PRE12 %s
2-
// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu -fclang-abi-compat=3.0 %s -emit-llvm -o - | FileCheck --check-prefixes=CHECK,PRE39,PRE5,PRE12 %s
3-
// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu -fclang-abi-compat=3.8 %s -emit-llvm -o - | FileCheck --check-prefixes=CHECK,PRE39,PRE5,PRE12 %s
4-
// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu -fclang-abi-compat=3.9 %s -emit-llvm -o - | FileCheck --check-prefixes=CHECK,V39,PRE5,PRE12 %s
5-
// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu -fclang-abi-compat=4.0 %s -emit-llvm -o - | FileCheck --check-prefixes=CHECK,V39,PRE5,PRE12 %s
6-
// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu -fclang-abi-compat=5 %s -emit-llvm -o - | FileCheck --check-prefixes=CHECK,V39,V5,PRE12,PRE12-CXX17 %s
7-
// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu -fclang-abi-compat=11 %s -emit-llvm -o - | FileCheck --check-prefixes=CHECK,V39,V5,PRE12,PRE12-CXX17 %s
8-
// RUN: %clang_cc1 -std=c++98 -triple x86_64-linux-gnu -fclang-abi-compat=latest %s -emit-llvm -o - | FileCheck --check-prefixes=CHECK,V39,V5,V12 %s
9-
// RUN: %clang_cc1 -std=c++20 -triple x86_64-linux-gnu -fclang-abi-compat=latest %s -emit-llvm -o - | FileCheck --check-prefixes=CHECK,V39,V5,V12,V12-CXX17 %s
1+
// RUN: %clang_cc1 -std=c++98 -triple x86_64-linux-gnu -fenable-matrix -fclang-abi-compat=3.0 %s -emit-llvm -o - -Wno-c++11-extensions \
2+
// RUN: | FileCheck --check-prefixes=CHECK,PRE39,PRE5,PRE12 %s
3+
// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu -fenable-matrix -fclang-abi-compat=3.0 %s -emit-llvm -o - \
4+
// RUN: | FileCheck --check-prefixes=CHECK,PRE39,PRE5,PRE12 %s
5+
// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu -fenable-matrix -fclang-abi-compat=3.8 %s -emit-llvm -o - \
6+
// RUN: | FileCheck --check-prefixes=CHECK,PRE39,PRE5,PRE12 %s
7+
// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu -fenable-matrix -fclang-abi-compat=3.9 %s -emit-llvm -o - \
8+
// RUN: | FileCheck --check-prefixes=CHECK,V39,PRE5,PRE12 %s
9+
// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu -fenable-matrix -fclang-abi-compat=4.0 %s -emit-llvm -o - \
10+
// RUN: | FileCheck --check-prefixes=CHECK,V39,PRE5,PRE12 %s
11+
// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu -fenable-matrix -fclang-abi-compat=5 %s -emit-llvm -o - \
12+
// RUN: | FileCheck --check-prefixes=CHECK,V39,V5,PRE12,PRE12-CXX17 %s
13+
// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu -fenable-matrix -fclang-abi-compat=11 %s -emit-llvm -o - \
14+
// RUN: | FileCheck --check-prefixes=CHECK,V39,V5,PRE12,PRE12-CXX17 %s
15+
// RUN: %clang_cc1 -std=c++20 -triple x86_64-linux-gnu -fenable-matrix -fclang-abi-compat=11 %s -emit-llvm -o - \
16+
// RUN: | FileCheck --check-prefixes=CHECK,V39,V5,PRE12,PRE12-CXX17,PRE12-CXX20 %s
17+
// RUN: %clang_cc1 -std=c++98 -triple x86_64-linux-gnu -fenable-matrix -fclang-abi-compat=latest %s -emit-llvm -o - -Wno-c++11-extensions \
18+
// RUN: | FileCheck --check-prefixes=CHECK,V39,V5,V12 %s
19+
// RUN: %clang_cc1 -std=c++20 -triple x86_64-linux-gnu -fenable-matrix -fclang-abi-compat=latest %s -emit-llvm -o - \
20+
// RUN: | FileCheck --check-prefixes=CHECK,V39,V5,V12,V12-CXX17,V12-CXX20 %s
1021

1122
typedef __attribute__((vector_size(8))) long long v1xi64;
1223
void clang39(v1xi64) {}
@@ -55,3 +66,68 @@ template void clang12_b<arr>();
5566
// CHECK: @_Z9clang12_cIXadL_Z3arrEEEvv
5667
template<const char (*)[6]> void clang12_c() {}
5768
template void clang12_c<&arr>();
69+
70+
71+
/// Tests for <template-arg> <expr-primary> changes in clang12:
72+
namespace expr_primary {
73+
struct A {
74+
template<int N> struct Int {};
75+
template<int& N> struct Ref {};
76+
};
77+
78+
/// Check various DeclRefExpr manglings
79+
80+
// PRE12: @_ZN12expr_primary5test1INS_1AEEEvNT_3IntIXLi1EEEE
81+
// V12: @_ZN12expr_primary5test1INS_1AEEEvNT_3IntILi1EEE
82+
template <typename T> void test1(typename T::template Int<1> a) {}
83+
template void test1<A>(typename A::template Int<1> a);
84+
85+
enum Enum { EnumVal = 4 };
86+
int Global;
87+
88+
// PRE12: @_ZN12expr_primary5test2INS_1AEEEvNT_3IntIXLNS_4EnumE4EEEE
89+
// V12: @_ZN12expr_primary5test2INS_1AEEEvNT_3IntILNS_4EnumE4EEE
90+
template <typename T> void test2(typename T::template Int<EnumVal> a) {}
91+
template void test2<A>(typename A::template Int<4> a);
92+
93+
// CHECK: @_ZN12expr_primary5test3ILi3EEEvNS_1A3IntIXT_EEE
94+
template <int X> void test3(typename A::template Int<X> a) {}
95+
template void test3<3>(A::Int<3> a);
96+
97+
#if __cplusplus >= 202002L
98+
// CHECK-CXX20: @_ZN12expr_primary5test4INS_1AEEEvNT_3RefIL_ZNS_6GlobalEEEE
99+
template <typename T> void test4(typename T::template Ref<(Global)> a) {}
100+
template void test4<A>(typename A::template Ref<Global> a);
101+
102+
struct B {
103+
struct X {
104+
constexpr X(double) {}
105+
constexpr X(int&) {}
106+
};
107+
template<X> struct Y {};
108+
};
109+
110+
// PRE12-CXX20: _ZN12expr_primary5test5INS_1BEEEvNT_1YIXLd3ff0000000000000EEEE
111+
// V12-CXX20: _ZN12expr_primary5test5INS_1BEEEvNT_1YILd3ff0000000000000EEE
112+
template<typename T> void test5(typename T::template Y<1.0>) { }
113+
template void test5<B>(typename B::Y<1.0>);
114+
115+
// PRE12-CXX20: @_ZN12expr_primary5test6INS_1BEEENT_1YIL_ZZNS_5test6EiE1bEEEi
116+
// V12-CXX20: @_ZN12expr_primary5test6INS_1BEEENT_1YIXfp_EEEi
117+
template<typename T> auto test6(int b) -> typename T::template Y<b> { return {}; }
118+
template auto test6<B>(int b) -> B::Y<b>;
119+
#endif
120+
121+
/// Verify non-dependent type-traits within a dependent template arg.
122+
123+
// PRE12: @_ZN12expr_primary5test7INS_1AEEEvNT_3IntIXLm1EEEE
124+
// V12: @_ZN12expr_primary5test7INS_1AEEEvNT_3IntILm1EEE
125+
template <class T> void test7(typename T::template Int<sizeof(char)> a) {}
126+
template void test7<A>(A::Int<1>);
127+
128+
// PRE12: @_ZN12expr_primary5test8ILi2EEEvu11matrix_typeIXLi1EEXT_EiE
129+
// V12: @_ZN12expr_primary5test8ILi2EEEvu11matrix_typeILi1EXT_EiE
130+
template<int N> using matrix1xN = int __attribute__((matrix_type(1, N)));
131+
template<int N> void test8(matrix1xN<N> a) {}
132+
template void test8<2>(matrix1xN<2> a);
133+
}

clang/test/CodeGenCXX/mangle-abi-tag.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ namespace pr30440 {
225225
template<class F> void g(F);
226226
template<class ...A> auto h(A ...a)->decltype (g (0, g < a > (a) ...)) {
227227
}
228-
// CHECK-DAG: define {{.*}} @_ZN7pr304401hIJEEEDTcl1gLi0Espcl1gIL_ZZNS_1hEDpT_E1aEEfp_EEES2_(
228+
// CHECK-DAG: define {{.*}} @_ZN7pr304401hIJEEEDTcl1gLi0Espcl1gIXfp_EEfp_EEEDpT_(
229229

230230
void pr30440_test () {
231231
h();

clang/test/CodeGenCXX/mangle-concept.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ template <bool> struct S {};
66
template <typename> concept C = true;
77
template <typename T = int> S<C<T>> f0() { return S<C<T>>{}; }
88
template S<C<int>> f0<>();
9-
// CHECK: @_ZN5test12f0IiEENS_1SIXL_ZNS_1CIT_EEEEEEv(
9+
// CHECK: @_ZN5test12f0IiEENS_1SIL_ZNS_1CIT_EEEEEv(
1010
}
1111

1212
template <bool> struct S {};
1313
template <typename> concept C = true;
1414
template <typename T = int> S<C<T>> f0() { return S<C<T>>{}; }
1515
template S<C<int>> f0<>();
16-
// CHECK: @_Z2f0IiE1SIXL_Z1CIT_EEEEv(
16+
// CHECK: @_Z2f0IiE1SIL_Z1CIT_EEEv(

clang/test/CodeGenCXX/mangle-template.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ namespace test17 {
270270
// Note: there is no J...E here, because we can't form a pack argument, and
271271
// the 5u and 6u are mangled with the original type 'j' (unsigned int) not
272272
// with the resolved type 'i' (signed int).
273-
// CHECK: define {{.*}} @_ZN6test171hILi4EJLi1ELi2ELi3EEEEvNS_1XIXspT0_EXLj5EEXT_EXLj6EEEE
273+
// CHECK: define {{.*}} @_ZN6test171hILi4EJLi1ELi2ELi3EEEEvNS_1XIXspT0_ELj5EXT_ELj6EEE
274274
template<int D, int ...C> void h(X<C..., 5u, D, 6u>) {}
275275
void i() { h<4, 1, 2, 3>({}); }
276276

@@ -323,7 +323,7 @@ namespace partially_dependent_template_args {
323323
// callee is unresolved, the rest mangle the converted argument Lj0E
324324
// because the callee is resolved.
325325
void h() {
326-
// CHECK: @_ZN33partially_dependent_template_args5test22g1INS0_1XEEEvDTcl1fIXLi0EEEcvT__EEE
326+
// CHECK: @_ZN33partially_dependent_template_args5test22g1INS0_1XEEEvDTcl1fILi0EEcvT__EEE
327327
g1<X>({});
328328
// CHECK: @_ZN33partially_dependent_template_args5test22g2IiEEvDTplclL_ZNS0_1fILj0EEEiNS0_1XEEilEEcvT__EE
329329
g2<int>({});

clang/test/CodeGenCXX/mangle.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1123,7 +1123,7 @@ namespace test56 {
11231123
namespace test57 {
11241124
struct X { template <int N> int f(); } x;
11251125
template<int N> void f(decltype(x.f<0>() + N)) {}
1126-
// CHECK-LABEL: @_ZN6test571fILi0EEEvDTplcldtL_ZNS_1xEE1fIXLi0EEEET_E
1126+
// CHECK-LABEL: @_ZN6test571fILi0EEEvDTplcldtL_ZNS_1xEE1fILi0EEET_E
11271127
template void f<0>(int);
11281128
}
11291129

clang/test/CodeGenCXX/matrix-type.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -215,14 +215,14 @@ void test_template_deduction() {
215215
// CHECK-NEXT: %m4 = alloca [144 x float], align 4
216216
// CHECK-NEXT: %v = alloca %struct.selector.3, align 1
217217
// CHECK-NEXT: %undef.agg.tmp4 = alloca %struct.selector.3, align 1
218-
// CHECK-NEXT: call void @_Z10use_matrixIiLm12EE8selectorILi3EERu11matrix_typeIXLm10EEXT0_ET_E([120 x i32]* nonnull align 4 dereferenceable(480) %m0)
218+
// CHECK-NEXT: call void @_Z10use_matrixIiLm12EE8selectorILi3EERu11matrix_typeILm10EXT0_ET_E([120 x i32]* nonnull align 4 dereferenceable(480) %m0)
219219
// CHECK-NEXT: call void @_Z10use_matrixIiE8selectorILi2EERu11matrix_typeILm10ELm10ET_E([100 x i32]* nonnull align 4 dereferenceable(400) %m1)
220-
// CHECK-NEXT: call void @_Z10use_matrixIiLm12EE8selectorILi1EERu11matrix_typeIXT0_EXLm10EET_E([120 x i32]* nonnull align 4 dereferenceable(480) %m2)
220+
// CHECK-NEXT: call void @_Z10use_matrixIiLm12EE8selectorILi1EERu11matrix_typeIXT0_ELm10ET_E([120 x i32]* nonnull align 4 dereferenceable(480) %m2)
221221
// CHECK-NEXT: call void @_Z10use_matrixIiLm12ELm12EE8selectorILi0EERu11matrix_typeIXT0_EXT1_ET_E([144 x i32]* nonnull align 4 dereferenceable(576) %m3)
222222
// CHECK-NEXT: call void @_Z10use_matrixILm12ELm12EE8selectorILi4EERu11matrix_typeIXT_EXT0_EfE([144 x float]* nonnull align 4 dereferenceable(576) %m4)
223223
// CHECK-NEXT: ret void
224224

225-
// CHECK-LABEL: define linkonce_odr void @_Z10use_matrixIiLm12EE8selectorILi3EERu11matrix_typeIXLm10EEXT0_ET_E([120 x i32]* nonnull align 4 dereferenceable(480) %m)
225+
// CHECK-LABEL: define linkonce_odr void @_Z10use_matrixIiLm12EE8selectorILi3EERu11matrix_typeILm10EXT0_ET_E([120 x i32]* nonnull align 4 dereferenceable(480) %m)
226226
// CHECK-NEXT: entry:
227227
// CHECK-NEXT: %m.addr = alloca [120 x i32]*, align 8
228228
// CHECK-NEXT: store [120 x i32]* %m, [120 x i32]** %m.addr, align 8
@@ -236,7 +236,7 @@ void test_template_deduction() {
236236
// CHECK-NEXT: call void @llvm.trap()
237237
// CHECK-NEXT: unreachable
238238

239-
// CHECK-LABEL: define linkonce_odr void @_Z10use_matrixIiLm12EE8selectorILi1EERu11matrix_typeIXT0_EXLm10EET_E([120 x i32]* nonnull align 4 dereferenceable(480) %m)
239+
// CHECK-LABEL: define linkonce_odr void @_Z10use_matrixIiLm12EE8selectorILi1EERu11matrix_typeIXT0_ELm10ET_E([120 x i32]* nonnull align 4 dereferenceable(480) %m)
240240
// CHECK-NEXT: entry:
241241
// CHECK-NEXT: %m.addr = alloca [120 x i32]*, align 8
242242
// CHECK-NEXT: store [120 x i32]* %m, [120 x i32]** %m.addr, align 8
@@ -277,10 +277,10 @@ void test_auto_t() {
277277
// CHECK-LABEL: define{{.*}} void @_Z11test_auto_tv()
278278
// CHECK-NEXT: entry:
279279
// CHECK-NEXT: %m = alloca [130 x i32], align 4
280-
// CHECK-NEXT: call void @_Z3fooILm13EEvRu11matrix_typeIXT_EXLm10EEiE([130 x i32]* nonnull align 4 dereferenceable(520) %m)
280+
// CHECK-NEXT: call void @_Z3fooILm13EEvRu11matrix_typeIXT_ELm10EiE([130 x i32]* nonnull align 4 dereferenceable(520) %m)
281281
// CHECK-NEXT: ret void
282282

283-
// CHECK-LABEL: define linkonce_odr void @_Z3fooILm13EEvRu11matrix_typeIXT_EXLm10EEiE([130 x i32]* nonnull align 4 dereferenceable(520) %m)
283+
// CHECK-LABEL: define linkonce_odr void @_Z3fooILm13EEvRu11matrix_typeIXT_ELm10EiE([130 x i32]* nonnull align 4 dereferenceable(520) %m)
284284
// CHECK-NEXT: entry:
285285
// CHECK-NEXT: %m.addr = alloca [130 x i32]*, align 8
286286
// CHECK-NEXT: store [130 x i32]* %m, [130 x i32]** %m.addr, align 8
@@ -326,7 +326,7 @@ void test_use_matrix_2() {
326326
// CHECK-NEXT: store <40 x float> %call, <40 x float>* %0, align 4
327327
// CHECK-NEXT: call void @_Z12use_matrix_2ILm2ELm12EE8selectorILi0EERu11matrix_typeIXplT_Li2EEXdvT0_Li2EEiERu11matrix_typeIXT_EXT0_EfE([24 x i32]* nonnull align 4 dereferenceable(96) %m1, [24 x float]* nonnull align 4 dereferenceable(96) %m2)
328328
// CHECK-NEXT: call void @_Z12use_matrix_2ILm5ELm8EE8selectorILi1EERu11matrix_typeIXplT_T0_EXT0_EiERu11matrix_typeIXT_EXmiT0_T_EfE([104 x i32]* nonnull align 4 dereferenceable(416) %m3, [15 x float]* nonnull align 4 dereferenceable(60) %m4)
329-
// CHECK-NEXT: %call2 = call <20 x float> @_Z12use_matrix_2ILm5EEu11matrix_typeIXplT_T_EXmiT_Li3EEfERu11matrix_typeIXT_EXLm10EEiE([50 x i32]* nonnull align 4 dereferenceable(200) %m5)
329+
// CHECK-NEXT: %call2 = call <20 x float> @_Z12use_matrix_2ILm5EEu11matrix_typeIXplT_T_EXmiT_Li3EEfERu11matrix_typeIXT_ELm10EiE([50 x i32]* nonnull align 4 dereferenceable(200) %m5)
330330
// CHECK-NEXT: %1 = bitcast [20 x float]* %r4 to <20 x float>*
331331
// CHECK-NEXT: store <20 x float> %call2, <20 x float>* %1, align 4
332332
// CHECK-NEXT: call void @_Z12use_matrix_3ILm6EE8selectorILi2EERu11matrix_typeIXmiT_Li2EEXT_EiE([24 x i32]* nonnull align 4 dereferenceable(96) %m1)
@@ -357,7 +357,7 @@ void test_use_matrix_2() {
357357
// CHECK-NEXT: call void @llvm.trap()
358358
// CHECK-NEXT: unreachable
359359

360-
// CHECK-LABEL: define linkonce_odr <20 x float> @_Z12use_matrix_2ILm5EEu11matrix_typeIXplT_T_EXmiT_Li3EEfERu11matrix_typeIXT_EXLm10EEiE([50 x i32]* nonnull align 4 dereferenceable(200) %m1)
360+
// CHECK-LABEL: define linkonce_odr <20 x float> @_Z12use_matrix_2ILm5EEu11matrix_typeIXplT_T_EXmiT_Li3EEfERu11matrix_typeIXT_ELm10EiE([50 x i32]* nonnull align 4 dereferenceable(200) %m1)
361361
// CHECK-NEXT: entry:
362362
// CHECK-NEXT: %m1.addr = alloca [50 x i32]*, align 8
363363
// CHECK-NEXT: store [50 x i32]* %m1, [50 x i32]** %m1.addr, align 8

clang/test/CodeGenCXX/microsoft-uuidof-mangling.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,12 @@ int main(int argc, const char * argv[])
6060
// CHECK-V11: call void @_Z15test_uuidofExprI9HasMemberEvDTu8__uuidofzsrT_6memberE(
6161
// CHECK-V12: call void @_Z15test_uuidofExprI9HasMemberEvDTu8__uuidofXsrT_6memberEEE(
6262
// CHECK-V11: call void @_Z16test_uuidofExpr2I10TestStructEvDTcmtlT_Eu8__uuidofzL_ZN9HasMember6memberEEE(
63-
// CHECK-V12: call void @_Z16test_uuidofExpr2I10TestStructEvDTcmtlT_Eu8__uuidofXL_ZN9HasMember6memberEEEEE(
64-
// TODO: the above mangling is wrong -- the X/E shouldn't be emitted: ^ ^
63+
// CHECK-V12: call void @_Z16test_uuidofExpr2I10TestStructEvDTcmtlT_Eu8__uuidofL_ZN9HasMember6memberEEEE(
6564
// CHECK: define linkonce_odr void @_ZN8UUIDTestI10TestStructL_Z42_GUID_eafa1952_66f8_438b_8fba_af1bbae42191EEC1Ev
6665
// CHECK-V11: define linkonce_odr void @_Z15test_uuidofTypeI10TestStructEvDTu8__uuidoftT_E(
6766
// CHECK-V12: define linkonce_odr void @_Z15test_uuidofTypeI10TestStructEvDTu8__uuidofT_EE(
6867
// CHECK-V11: define linkonce_odr void @_Z15test_uuidofExprI9HasMemberEvDTu8__uuidofzsrT_6memberE(
6968
// CHECK-V12: define linkonce_odr void @_Z15test_uuidofExprI9HasMemberEvDTu8__uuidofXsrT_6memberEEE(
7069
// CHECK-V11: define linkonce_odr void @_Z16test_uuidofExpr2I10TestStructEvDTcmtlT_Eu8__uuidofzL_ZN9HasMember6memberEEE(
71-
// CHECK-V12: define linkonce_odr void @_Z16test_uuidofExpr2I10TestStructEvDTcmtlT_Eu8__uuidofXL_ZN9HasMember6memberEEEEE(
72-
// TODO: the above mangling is wrong -- the X/E shouldn't be emitted: ^ ^
70+
// CHECK-V12: define linkonce_odr void @_Z16test_uuidofExpr2I10TestStructEvDTcmtlT_Eu8__uuidofL_ZN9HasMember6memberEEEE(
7371
// CHECK: define linkonce_odr void @_ZN8UUIDTestI10TestStructL_Z42_GUID_eafa1952_66f8_438b_8fba_af1bbae42191EEC2Ev

0 commit comments

Comments
 (0)