Skip to content

Commit 043a120

Browse files
committed
[cxx-interop] Avoid linker errors for multiple instantiations of a templated struct with non-type parameters
When mangling the name of a C++ template specialization, we currently ignore non-type templated parameter. This causes two different instantiations of the same templated type to have the same mangled name, triggering linker errors. This change makes sure we mangle all of the templated parameters by relying on Clang mangling logic. rdar://107757051
1 parent c8ec463 commit 043a120

10 files changed

+71
-35
lines changed

lib/AST/ASTMangler.cpp

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2647,11 +2647,34 @@ void ASTMangler::appendAnyGenericType(const GenericTypeDecl *decl) {
26472647
appendIdentifier(protocol->getObjCRuntimeNameAsString());
26482648
} else if (auto ctsd = dyn_cast<clang::ClassTemplateSpecializationDecl>(namedDecl)) {
26492649
// If this is a `ClassTemplateSpecializationDecl`, it was
2650-
// imported as a Swift decl with `__CxxTemplateInst...` name.
2651-
// `ClassTemplateSpecializationDecl`'s name does not include information about
2652-
// template arguments, and in order to prevent name clashes we use the
2653-
// name of the Swift decl which does include template arguments.
2654-
appendIdentifier(nominal->getName().str());
2650+
// imported as a Swift decl with `X<...>` name. Some types will be
2651+
// imported as X<_>, for instance, if they have non-type templated
2652+
// parameters. To disambiguate different specializations of the same
2653+
// templated type, we use a different mangling mechanism for C++ template
2654+
// specializations.
2655+
auto &clangCtx = ctsd->getASTContext();
2656+
// Itanium mangler produces valid Swift identifiers, use it to generate a
2657+
// name for this instantiation.
2658+
std::unique_ptr<clang::MangleContext> clangMangler{
2659+
clang::ItaniumMangleContext::create(clangCtx,
2660+
clangCtx.getDiagnostics())};
2661+
2662+
llvm::SmallString<128> storage;
2663+
llvm::raw_svector_ostream buffer(storage);
2664+
clangMangler->mangleTypeName(clangCtx.getRecordType(ctsd), buffer);
2665+
// The Itanium mangler does not provide a way to get the mangled
2666+
// representation of a type. Instead, we call mangleTypeName() that
2667+
// returns the name of the RTTI typeinfo symbol, and remove the _ZTS
2668+
// prefix. Then we prepend __CxxTemplateInst to reduce chances of conflict
2669+
// with regular C and C++ structs.
2670+
llvm::SmallString<128> mangledNameStorage;
2671+
llvm::raw_svector_ostream mangledName(mangledNameStorage);
2672+
assert(buffer.str().take_front(4) == "_ZTS");
2673+
mangledName << CXX_TEMPLATE_INST_PREFIX << buffer.str().drop_front(4);
2674+
2675+
StringRef mangledId =
2676+
decl->getASTContext().AllocateCopy(mangledName.str());
2677+
appendIdentifier(mangledId.str());
26552678
} else {
26562679
appendIdentifier(namedDecl->getName());
26572680
}

test/Interop/Cxx/namespace/class-inline-namespace-irgen.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ extension Parent.TypedefInInlineChild {
4848
return ""
4949
}
5050
}
51-
// CHECK: define hidden swiftcc {{.*}} @"$sSo6ParentO11InlineChildO0033TemplateInInlineChildInt8_ehGIixbV4testE6stringSSvg"()
51+
// CHECK: define hidden swiftcc {{.*}} @"$sSo6ParentO11InlineChildO027__CxxTemplateInstN6Parent11b7Child21e2InbC4IcEEV4testE6stringSSvg"()
5252

5353
extension Parent.InInlineChild {
5454
func doSomething() {
@@ -70,22 +70,22 @@ extension Parent.InlineChild.InSecondInlineChild {
7070
}
7171
// define hidden swiftcc {{.*}} @"$sSo6ParentO11InlineChildO06SecondbC0O02IndbC0V4testE1ySivg"()
7272

73-
// CHECK: define hidden swiftcc {{.*}} @"$s4test3useySSSo6ParentO11InlineChildO0033TemplateInInlineChildInt8_ehGIixbVF"()
74-
// CHECK: call swiftcc {{.*}} @"$sSo6ParentO11InlineChildO0033TemplateInInlineChildInt8_ehGIixbV4testE6stringSSvg"
73+
// CHECK: define hidden swiftcc {{.*}} @"$s4test3useySSSo6ParentO11InlineChildO027__CxxTemplateInstN6Parent11d7Child21g2IndE4IcEEVF"()
74+
// CHECK: call swiftcc {{.*}} @"$sSo6ParentO11InlineChildO027__CxxTemplateInstN6Parent11b7Child21e2InbC4IcEEV4testE6stringSSvg"
7575
func use(_ x: Parent.TypedefInInlineChild) -> String {
7676
let s = x.string
7777
return s
7878
}
7979

80-
// CHECK: define hidden swiftcc {{.*}} @"$s4test4use2ySSSo6ParentO11InlineChildO0033TemplateInInlineChildInt8_ehGIixbVF"()
81-
// CHECK: call swiftcc {{.*}} @"$sSo6ParentO11InlineChildO0033TemplateInInlineChildInt8_ehGIixbV4testE6stringSSvg"
80+
// CHECK: define hidden swiftcc {{.*}} @"$s4test4use2ySSSo6ParentO11InlineChildO027__CxxTemplateInstN6Parent11d7Child21g2IndE4IcEEVF"()
81+
// CHECK: call swiftcc {{.*}} @"$sSo6ParentO11InlineChildO027__CxxTemplateInstN6Parent11b7Child21e2InbC4IcEEV4testE6stringSSvg"
8282
func use2(_ x: Parent.InlineChild.TypedefInInlineChild) -> String {
8383
let s = x.string
8484
return s
8585
}
8686

8787
// define swiftcc void @"$s4testAAyySo6ParentO11InlineChildO02IncD0VF"()
88-
// CHECK: alloca %TSo6ParentO11InlineChildO0033TemplateInInlineChildInt8_ehGIixbV
88+
// CHECK: alloca %TSo6ParentO11InlineChildO027__CxxTemplateInstN6Parent11b7Child21e2InbC4IcEEV
8989
// CHECK: call {{.*}} @{{_ZN6Parent11InlineChild21TemplateInInlineChildIcEC|"\?\?0\?\$TemplateInInlineChild@D@InlineChild@Parent@@QEAA@XZ"}}
9090
// CHECK: call swiftcc void @"$sSo6ParentO11InlineChildO02InbC0V4testE11doSomethingyyF"(
9191
// CHECK: call swiftcc {{.*}} @"$sSo6ParentO11InlineChildO06SecondbC0O02IndbC0V4testE1xSivg"(

test/Interop/Cxx/templates/Inputs/class-template-non-type-parameter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ using size_t = __SIZE_TYPE__;
88
template <class T, size_t Size> struct MagicArray { T t[Size]; };
99

1010
typedef MagicArray<int, 2> MagicIntPair;
11+
typedef MagicArray<int, 3> MagicIntTriple;
1112

1213
#endif // TEST_INTEROP_CXX_TEMPLATES_INPUTS_CLASS_TEMPLATE_NON_TYPE_PARAMETER_H

test/Interop/Cxx/templates/class-template-instantiation-demangling.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ public func returnInstantiation() -> WrappedMagicInt {
99
return WrappedMagicInt()
1010
}
1111

12-
// CHECK: $s4main20receiveInstantiationyySo0025MagicWrapperInt32_lsFCfibVzF(%TSo0025MagicWrapperInt32_lsFCfibV* ---> @$s4main20receiveInstantiationyySo0025MagicWrapperInt32_lsFCfibVzF(%TSo0025MagicWrapperInt32_lsFCfibV*
13-
// CHECK: $s4main19returnInstantiationSo0025MagicWrapperInt32_lsFCfibVyF() ---> @$s4main19returnInstantiationSo0025MagicWrapperInt32_lsFCfibVyF()
12+
// CHECK: $s4main20receiveInstantiationyySo34__CxxTemplateInst12MagicWrapperIiEVzF(%TSo34__CxxTemplateInst12MagicWrapperIiEV* ---> @$s4main20receiveInstantiationyySo34__CxxTemplateInst12MagicWrapperIiEVzF(%TSo34__CxxTemplateInst12MagicWrapperIiEV*
13+
// CHECK: $s4main19returnInstantiationSo34__CxxTemplateInst12MagicWrapperIiEVyF() ---> @$s4main19returnInstantiationSo34__CxxTemplateInst12MagicWrapperIiEVyF()
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: %target-swift-emit-ir %s -I %S/Inputs -enable-experimental-cxx-interop | %FileCheck %s
2+
3+
import ClassTemplateNonTypeParameter
4+
5+
let p = MagicIntPair()
6+
let t = MagicIntTriple()
7+
8+
// CHECK: @"$s4main1pSo36__CxxTemplateInst10MagicArrayIiLm2EEVvp"
9+
// CHECK: @"$s4main1tSo36__CxxTemplateInst10MagicArrayIiLm3EEVvp"

test/Interop/Cxx/templates/class-template-non-type-parameter.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ var TemplatesTestSuite = TestSuite("TemplatesTestSuite")
1010
TemplatesTestSuite.test("typedeffed-non-type-parameter") {
1111
let pair = MagicIntPair(t: (1, 2))
1212
expectEqual(pair.t, (1, 2))
13+
14+
let triple = MagicIntTriple(t: (1, 2, 3))
15+
expectEqual(triple.t, (1, 2, 3))
1316
}
1417

1518
// TODO: This test doesn't work because Swift doesn't support defaulted generic

test/Interop/Cxx/templates/linkage-of-swift-symbols-for-imported-types-irgen.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ public func getMagicNumberForLinkageComparison() -> Any {
1616
// CHECK: $sSo11MagicNumberVMf" = linkonce_odr hidden constant
1717
// CHECK: $sSo11MagicNumberVML" = linkonce_odr hidden global
1818

19-
// CHECK: $sSo0031MagicWrapperMagicNumber_IJFJhAbVWV" = linkonce_odr hidden constant
20-
// CHECK: $sSo0031MagicWrapperMagicNumber_IJFJhAbVMn" = linkonce_odr hidden constant
21-
// CHECK: $sSo0031MagicWrapperMagicNumber_IJFJhAbVMf" = linkonce_odr hidden constant
22-
// CHECK: $sSo0031MagicWrapperMagicNumber_IJFJhAbVML" = linkonce_odr hidden global
19+
// CHECK: $sSo034__CxxTemplateInst12MagicWrapperI11D7NumberEVWV" = linkonce_odr hidden constant
20+
// CHECK: $sSo034__CxxTemplateInst12MagicWrapperI11D7NumberEVMn" = linkonce_odr hidden constant
21+
// CHECK: $sSo034__CxxTemplateInst12MagicWrapperI11D7NumberEVMf" = linkonce_odr hidden constant
22+
// CHECK: $sSo034__CxxTemplateInst12MagicWrapperI11D7NumberEVML" = linkonce_odr hidden global
2323

2424
// CHECK: $sSo11MagicNumberVMB" = linkonce_odr hidden constant
2525
// CHECK: $sSo11MagicNumberVMF" = linkonce_odr hidden constant
2626

27-
// CHECK: $sSo0031MagicWrapperMagicNumber_IJFJhAbVMB" = linkonce_odr hidden constant
28-
// CHECK: $sSo0031MagicWrapperMagicNumber_IJFJhAbVMF" = linkonce_odr hidden constant
27+
// CHECK: $sSo034__CxxTemplateInst12MagicWrapperI11D7NumberEVMB" = linkonce_odr hidden constant
28+
// CHECK: $sSo034__CxxTemplateInst12MagicWrapperI11D7NumberEVMF" = linkonce_odr hidden constant

test/Interop/Cxx/templates/mangling-irgen.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@ import Mangling
66
public func receiveInstantiation(_ i: inout WrappedMagicInt) {}
77

88
// Don't forget to update manglings.txt when changing s4main20receiveInstantiationyySo34__CxxTemplateInst12MagicWrapperIiEVzF
9-
// CHECK: define {{(protected |dllexport )?}}swiftcc void @"$s4main20receiveInstantiationyySo0025MagicWrapperInt32_lsFCfibVzF"(%TSo0025MagicWrapperInt32_lsFCfibV* nocapture dereferenceable(1) %0)
9+
// CHECK: define {{(protected |dllexport )?}}swiftcc void @"$s4main20receiveInstantiationyySo34__CxxTemplateInst12MagicWrapperIiEVzF"(%TSo34__CxxTemplateInst12MagicWrapperIiEV* nocapture dereferenceable(1) %0)
1010

1111
public func receiveInstantiation(_ i: inout WrappedMagicBool) {}
1212

13-
// CHECK: define {{(protected |dllexport )?}}swiftcc void @"$s4main20receiveInstantiationyySo0024MagicWrapperBool_npAIefbVzF"(%TSo0024MagicWrapperBool_npAIefbV* nocapture dereferenceable(1) %0)
13+
// CHECK: define {{(protected |dllexport )?}}swiftcc void @"$s4main20receiveInstantiationyySo34__CxxTemplateInst12MagicWrapperIbEVzF"(%TSo34__CxxTemplateInst12MagicWrapperIbEV* nocapture dereferenceable(1) %0)
1414

1515
public func returnInstantiation() -> WrappedMagicInt {
1616
return WrappedMagicInt()
1717
}
1818

1919
// Don't forget to update manglings.txt when changing s4main19returnInstantiationSo34__CxxTemplateInst12MagicWrapperIiEVyF
20-
// CHECK: define {{(protected |dllexport )?}}swiftcc void @"$s4main19returnInstantiationSo0025MagicWrapperInt32_lsFCfibVyF"()
20+
// CHECK: define {{(protected |dllexport )?}}swiftcc void @"$s4main19returnInstantiationSo34__CxxTemplateInst12MagicWrapperIiEVyF"()
2121

test/Interop/Cxx/templates/mangling-silgen.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@ import Mangling
55
public func recvInstantiation(_ i: inout WrappedMagicInt) {}
66

77
// CHECK: // recvInstantiation(_:)
8-
// CHECK: sil @$s4main17recvInstantiationyySo0025MagicWrapperInt32_lsFCfibVzF : $@convention(thin) (@inout MagicWrapper<Int32>) -> ()
8+
// CHECK: sil @$s4main17recvInstantiationyySo34__CxxTemplateInst12MagicWrapperIiEVzF : $@convention(thin) (@inout MagicWrapper<Int32>) -> ()
99

1010
public func recvInstantiation(_ i: inout WrappedMagicBool) {}
1111

1212
// CHECK: // recvInstantiation(_:)
13-
// CHECK: sil @$s4main17recvInstantiationyySo0024MagicWrapperBool_npAIefbVzF : $@convention(thin) (@inout MagicWrapper<Bool>) -> ()
13+
// CHECK: sil @$s4main17recvInstantiationyySo34__CxxTemplateInst12MagicWrapperIbEVzF : $@convention(thin) (@inout MagicWrapper<Bool>) -> ()
1414

1515
public func returnInstantiation() -> WrappedMagicInt {
1616
return WrappedMagicInt()
1717
}
1818

1919
// CHECK: // returnInstantiation()
20-
// CHECK: sil @$s4main19returnInstantiationSo0025MagicWrapperInt32_lsFCfibVyF : $@convention(thin) () -> MagicWrapper<Int32>
20+
// CHECK: sil @$s4main19returnInstantiationSo34__CxxTemplateInst12MagicWrapperIiEVyF : $@convention(thin) () -> MagicWrapper<Int32>

test/Interop/CxxToSwiftToCxx/bridge-cxx-struct-back-to-cxx.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -156,15 +156,15 @@ public func takeTrivialInout(_ x: inout Trivial) {
156156
// CHECK-NEXT: #endif
157157

158158

159-
// CHECK: SWIFT_EXTERN void $s8UseCxxTy13retNonTrivialSo2nsO0031NonTrivialTemplateInt32_fbGJhubVyF(SWIFT_INDIRECT_RESULT void * _Nonnull) SWIFT_NOEXCEPT SWIFT_CALL; // retNonTrivial()
159+
// CHECK: SWIFT_EXTERN void $s8UseCxxTy13retNonTrivialSo2nsO02__b18TemplateInstN2ns18efH4IiEEVyF(SWIFT_INDIRECT_RESULT void * _Nonnull) SWIFT_NOEXCEPT SWIFT_CALL; // retNonTrivial()
160160
// CHECK: SWIFT_EXTERN struct swift_interop_returnStub_UseCxxTy_uint32_t_0_4 $s8UseCxxTy10retTrivialSo0E0VyF(void) SWIFT_NOEXCEPT SWIFT_CALL; // retTrivial()
161161

162162
// CHECK: ns::Immortal *_Nonnull retImmortal() noexcept SWIFT_SYMBOL({{.*}}) SWIFT_WARN_UNUSED_RESULT {
163163
// CHECK-NEXT: return _impl::$s8UseCxxTy11retImmortalSo2nsO0E0VyF();
164164
// CHECK-NEXT: }
165165

166166
// CHECK: ns::ImmortalTemplate<int> *_Nonnull retImmortalTemplate() noexcept SWIFT_SYMBOL({{.*}}) SWIFT_WARN_UNUSED_RESULT {
167-
// CHECK-NEXT: return _impl::$s8UseCxxTy19retImmortalTemplateSo2nsO0029ImmortalTemplateInt32_hEFAhqbVyF();
167+
// CHECK-NEXT: return _impl::$s8UseCxxTy19retImmortalTemplateSo2nsO02__bf10InstN2ns16eF4IiEEVyF();
168168
// CHECK-NEXT: }
169169

170170
// CHECK: } // end namespace
@@ -173,7 +173,7 @@ public func takeTrivialInout(_ x: inout Trivial) {
173173
// CHECK-NEXT: namespace _impl {
174174
// CHECK-EMPTY:
175175
// CHECK-NEXT: // Type metadata accessor for NonTrivialTemplateInt
176-
// CHECK-NEXT: SWIFT_EXTERN swift::_impl::MetadataResponseTy $sSo2nsO0031NonTrivialTemplateInt32_fbGJhubVMa(swift::_impl::MetadataRequestTy) SWIFT_NOEXCEPT SWIFT_CALL;
176+
// CHECK-NEXT: SWIFT_EXTERN swift::_impl::MetadataResponseTy $sSo2nsO033__CxxTemplateInstN2ns18NonTrivialC4IiEEVMa(swift::_impl::MetadataRequestTy) SWIFT_NOEXCEPT SWIFT_CALL;
177177
// CHECK-EMPTY:
178178
// CHECK-EMPTY:
179179
// CHECK-NEXT: } // namespace _impl
@@ -185,7 +185,7 @@ public func takeTrivialInout(_ x: inout Trivial) {
185185
// CHECK-NEXT: template<>
186186
// CHECK-NEXT: struct TypeMetadataTrait<ns::NonTrivialTemplateInt> {
187187
// CHECK-NEXT: static SWIFT_INLINE_THUNK void * _Nonnull getTypeMetadata() {
188-
// CHECK-NEXT: return _impl::$sSo2nsO0031NonTrivialTemplateInt32_fbGJhubVMa(0)._0;
188+
// CHECK-NEXT: return _impl::$sSo2nsO033__CxxTemplateInstN2ns18NonTrivialC4IiEEVMa(0)._0;
189189
// CHECK-NEXT: }
190190
// CHECK-NEXT: };
191191
// CHECK-NEXT: namespace _impl{
@@ -200,7 +200,7 @@ public func takeTrivialInout(_ x: inout Trivial) {
200200
// CHECK: SWIFT_INLINE_THUNK ns::NonTrivialTemplate<int> retNonTrivial() noexcept SWIFT_SYMBOL({{.*}}) SWIFT_WARN_UNUSED_RESULT {
201201
// CHECK-NEXT: alignas(alignof(ns::NonTrivialTemplate<int>)) char storage[sizeof(ns::NonTrivialTemplate<int>)];
202202
// CHECK-NEXT: auto * _Nonnull storageObjectPtr = reinterpret_cast<ns::NonTrivialTemplate<int> *>(storage);
203-
// CHECK-NEXT: _impl::$s8UseCxxTy13retNonTrivialSo2nsO0031NonTrivialTemplateInt32_fbGJhubVyF(storage);
203+
// CHECK-NEXT: _impl::$s8UseCxxTy13retNonTrivialSo2nsO02__b18TemplateInstN2ns18efH4IiEEVyF(storage);
204204
// CHECK-NEXT: ns::NonTrivialTemplate<int> result(static_cast<ns::NonTrivialTemplate<int> &&>(*storageObjectPtr));
205205
// CHECK-NEXT: storageObjectPtr->~NonTrivialTemplate();
206206
// CHECK-NEXT: return result;
@@ -212,7 +212,7 @@ public func takeTrivialInout(_ x: inout Trivial) {
212212
// CHECK-NEXT: namespace _impl {
213213
// CHECK-EMPTY:
214214
// CHECK-NEXT: // Type metadata accessor for NonTrivialTemplateTrivial
215-
// CHECK-NEXT: SWIFT_EXTERN swift::_impl::MetadataResponseTy $sSo2nsO0037NonTrivialTemplateTrivialinNS_CsGGkdcVMa(swift::_impl::MetadataRequestTy) SWIFT_NOEXCEPT SWIFT_CALL;
215+
// CHECK-NEXT: SWIFT_EXTERN swift::_impl::MetadataResponseTy $sSo2nsO033__CxxTemplateInstN2ns18NonTrivialC20INS_11TrivialinNSEEEVMa(swift::_impl::MetadataRequestTy) SWIFT_NOEXCEPT SWIFT_CALL;
216216
// CHECK-EMPTY:
217217
// CHECK-EMPTY:
218218
// CHECK-NEXT: } // namespace _impl
@@ -224,7 +224,7 @@ public func takeTrivialInout(_ x: inout Trivial) {
224224
// CHECK-NEXT: template<>
225225
// CHECK-NEXT: struct TypeMetadataTrait<ns::NonTrivialTemplateTrivial> {
226226
// CHECK-NEXT: static SWIFT_INLINE_THUNK void * _Nonnull getTypeMetadata() {
227-
// CHECK-NEXT: return _impl::$sSo2nsO0037NonTrivialTemplateTrivialinNS_CsGGkdcVMa(0)._0;
227+
// CHECK-NEXT: return _impl::$sSo2nsO033__CxxTemplateInstN2ns18NonTrivialC20INS_11TrivialinNSEEEVMa(0)._0;
228228
// CHECK-NEXT: }
229229
// CHECK-NEXT: };
230230
// CHECK-NEXT: namespace _impl{
@@ -239,7 +239,7 @@ public func takeTrivialInout(_ x: inout Trivial) {
239239
// CHECK-NEXT: SWIFT_INLINE_THUNK ns::NonTrivialTemplate<ns::TrivialinNS> retNonTrivial2() noexcept SWIFT_SYMBOL({{.*}}) SWIFT_WARN_UNUSED_RESULT {
240240
// CHECK-NEXT: alignas(alignof(ns::NonTrivialTemplate<ns::TrivialinNS>)) char storage[sizeof(ns::NonTrivialTemplate<ns::TrivialinNS>)];
241241
// CHECK-NEXT: auto * _Nonnull storageObjectPtr = reinterpret_cast<ns::NonTrivialTemplate<ns::TrivialinNS> *>(storage);
242-
// CHECK-NEXT: _impl::$s8UseCxxTy14retNonTrivial2So2nsO0037NonTrivialTemplateTrivialinNS_CsGGkdcVyF(storage);
242+
// CHECK-NEXT: _impl::$s8UseCxxTy14retNonTrivial2So2nsO02__b18TemplateInstN2ns18e7TrivialH20INS_11TrivialinNSEEEVyF(storage);
243243
// CHECK-NEXT: ns::NonTrivialTemplate<ns::TrivialinNS> result(static_cast<ns::NonTrivialTemplate<ns::TrivialinNS> &&>(*storageObjectPtr));
244244
// CHECK-NEXT: storageObjectPtr->~NonTrivialTemplate();
245245
// CHECK-NEXT: return result;
@@ -268,11 +268,11 @@ public func takeTrivialInout(_ x: inout Trivial) {
268268
// CHECK-NEXT: }
269269

270270
// CHECK: void takeImmortalTemplate(ns::ImmortalTemplate<int> *_Nonnull x) noexcept SWIFT_SYMBOL({{.*}}) {
271-
// CHECK-NEXT: return _impl::$s8UseCxxTy20takeImmortalTemplateyySo2nsO0029ImmortalTemplateInt32_hEFAhqbVF(x);
271+
// CHECK-NEXT: return _impl::$s8UseCxxTy20takeImmortalTemplateyySo2nsO02__bf10InstN2ns16eF4IiEEVF(x);
272272
// CHECK-NEXT: }
273273

274274
// CHECK: SWIFT_INLINE_THUNK void takeNonTrivial2(const ns::NonTrivialTemplate<ns::TrivialinNS>& x) noexcept SWIFT_SYMBOL({{.*}}) {
275-
// CHECK-NEXT: return _impl::$s8UseCxxTy15takeNonTrivial2yySo2nsO0037NonTrivialTemplateTrivialinNS_CsGGkdcVF(swift::_impl::getOpaquePointer(x));
275+
// CHECK-NEXT: return _impl::$s8UseCxxTy15takeNonTrivial2yySo2nsO02__b18TemplateInstN2ns18e7TrivialH20INS_11TrivialinNSEEEVF(swift::_impl::getOpaquePointer(x));
276276
// CHECK-NEXT: }
277277

278278
// CHECK: SWIFT_INLINE_THUNK void takeTrivial(const Trivial& x) noexcept SWIFT_SYMBOL({{.*}}) {

0 commit comments

Comments
 (0)