@@ -46,6 +46,9 @@ class IRGenMangler : public Mangle::ASTMangler {
46
46
IRGenMangler () { }
47
47
48
48
std::string mangleDispatchThunk (const FuncDecl *func) {
49
+ // Dispatch thunks do not mangle inverse conformances.
50
+ llvm::SaveAndRestore X (AllowInverses, false );
51
+
49
52
beginMangling ();
50
53
appendEntity (func);
51
54
appendOperator (" Tj" );
@@ -55,6 +58,9 @@ class IRGenMangler : public Mangle::ASTMangler {
55
58
std::string mangleDerivativeDispatchThunk (
56
59
const AbstractFunctionDecl *func,
57
60
AutoDiffDerivativeFunctionIdentifier *derivativeId) {
61
+ // Dispatch thunks do not mangle inverse conformances.
62
+ llvm::SaveAndRestore X (AllowInverses, false );
63
+
58
64
beginManglingWithAutoDiffOriginalFunction (func);
59
65
auto kind = Demangle::getAutoDiffFunctionKind (derivativeId->getKind ());
60
66
auto *resultIndices =
@@ -71,13 +77,19 @@ class IRGenMangler : public Mangle::ASTMangler {
71
77
72
78
std::string mangleConstructorDispatchThunk (const ConstructorDecl *ctor,
73
79
bool isAllocating) {
80
+ // Dispatch thunks do not mangle inverse conformances.
81
+ llvm::SaveAndRestore X (AllowInverses, false );
82
+
74
83
beginMangling ();
75
84
appendConstructorEntity (ctor, isAllocating);
76
85
appendOperator (" Tj" );
77
86
return finalize ();
78
87
}
79
88
80
89
std::string mangleMethodDescriptor (const FuncDecl *func) {
90
+ // Method descriptors do not mangle inverse conformances.
91
+ llvm::SaveAndRestore X (AllowInverses, false );
92
+
81
93
beginMangling ();
82
94
appendEntity (func);
83
95
appendOperator (" Tq" );
@@ -87,6 +99,9 @@ class IRGenMangler : public Mangle::ASTMangler {
87
99
std::string mangleDerivativeMethodDescriptor (
88
100
const AbstractFunctionDecl *func,
89
101
AutoDiffDerivativeFunctionIdentifier *derivativeId) {
102
+ // Method descriptors do not mangle inverse conformances.
103
+ llvm::SaveAndRestore X (AllowInverses, false );
104
+
90
105
beginManglingWithAutoDiffOriginalFunction (func);
91
106
auto kind = Demangle::getAutoDiffFunctionKind (derivativeId->getKind ());
92
107
auto *resultIndices =
@@ -103,6 +118,9 @@ class IRGenMangler : public Mangle::ASTMangler {
103
118
104
119
std::string mangleConstructorMethodDescriptor (const ConstructorDecl *ctor,
105
120
bool isAllocating) {
121
+ // Method descriptors do not mangle inverse conformances.
122
+ llvm::SaveAndRestore X (AllowInverses, false );
123
+
106
124
beginMangling ();
107
125
appendConstructorEntity (ctor, isAllocating);
108
126
appendOperator (" Tq" );
@@ -327,6 +345,10 @@ class IRGenMangler : public Mangle::ASTMangler {
327
345
// among the type descriptors of different protocols.
328
346
llvm::SaveAndRestore<bool > optimizeProtocolNames (OptimizeProtocolNames,
329
347
false );
348
+
349
+ // No mangling of inverse conformances inside protocols.
350
+ llvm::SaveAndRestore X (AllowInverses, false );
351
+
330
352
beginMangling ();
331
353
bool isAssocTypeAtDepth = false ;
332
354
(void )appendAssocType (
@@ -341,6 +363,9 @@ class IRGenMangler : public Mangle::ASTMangler {
341
363
const ProtocolDecl *proto,
342
364
CanType subject,
343
365
const ProtocolDecl *requirement) {
366
+ // No mangling of inverse conformances inside protocols.
367
+ llvm::SaveAndRestore X (AllowInverses, false );
368
+
344
369
beginMangling ();
345
370
appendAnyGenericType (proto);
346
371
if (isa<GenericTypeParamType>(subject)) {
@@ -357,6 +382,9 @@ class IRGenMangler : public Mangle::ASTMangler {
357
382
std::string mangleBaseConformanceDescriptor (
358
383
const ProtocolDecl *proto,
359
384
const ProtocolDecl *requirement) {
385
+ // No mangling of inverse conformances inside protocols.
386
+ llvm::SaveAndRestore X (AllowInverses, false );
387
+
360
388
beginMangling ();
361
389
appendAnyGenericType (proto);
362
390
appendProtocolName (requirement);
@@ -368,6 +396,9 @@ class IRGenMangler : public Mangle::ASTMangler {
368
396
const ProtocolDecl *proto,
369
397
CanType subject,
370
398
const ProtocolDecl *requirement) {
399
+ // No mangling of inverse conformances inside protocols.
400
+ llvm::SaveAndRestore X (AllowInverses, false );
401
+
371
402
beginMangling ();
372
403
appendAnyGenericType (proto);
373
404
bool isFirstAssociatedTypeIdentifier = true ;
@@ -385,20 +416,27 @@ class IRGenMangler : public Mangle::ASTMangler {
385
416
const RootProtocolConformance *conformance);
386
417
387
418
std::string manglePropertyDescriptor (const AbstractStorageDecl *storage) {
419
+ llvm::SaveAndRestore X (AllowInverses, inversesAllowed (storage));
388
420
beginMangling ();
389
421
appendEntity (storage);
390
422
appendOperator (" MV" );
391
423
return finalize ();
392
424
}
393
425
394
426
std::string mangleFieldOffset (const ValueDecl *Decl) {
427
+ // No mangling of inverse conformances.
428
+ llvm::SaveAndRestore X (AllowInverses, false );
429
+
395
430
beginMangling ();
396
431
appendEntity (Decl);
397
432
appendOperator (" Wvd" );
398
433
return finalize ();
399
434
}
400
435
401
436
std::string mangleEnumCase (const ValueDecl *Decl) {
437
+ // No mangling of inverse conformances.
438
+ llvm::SaveAndRestore X (AllowInverses, false );
439
+
402
440
beginMangling ();
403
441
appendEntity (Decl);
404
442
appendOperator (" WC" );
@@ -716,14 +754,7 @@ class IRGenMangler : public Mangle::ASTMangler {
716
754
717
755
std::string mangleConformanceSymbol (Type type,
718
756
const ProtocolConformance *Conformance,
719
- const char *Op) {
720
- beginMangling ();
721
- if (type)
722
- appendType (type, nullptr );
723
- appendProtocolConformance (Conformance);
724
- appendOperator (Op);
725
- return finalize ();
726
- }
757
+ const char *Op);
727
758
};
728
759
729
760
// / Determines if the minimum deployment target's runtime demangler will not
0 commit comments