@@ -46,6 +46,9 @@ class IRGenMangler : public Mangle::ASTMangler {
4646 IRGenMangler () { }
4747
4848 std::string mangleDispatchThunk (const FuncDecl *func) {
49+ // Dispatch thunks do not mangle inverse conformances.
50+ llvm::SaveAndRestore X (AllowInverses, false );
51+
4952 beginMangling ();
5053 appendEntity (func);
5154 appendOperator (" Tj" );
@@ -55,6 +58,9 @@ class IRGenMangler : public Mangle::ASTMangler {
5558 std::string mangleDerivativeDispatchThunk (
5659 const AbstractFunctionDecl *func,
5760 AutoDiffDerivativeFunctionIdentifier *derivativeId) {
61+ // Dispatch thunks do not mangle inverse conformances.
62+ llvm::SaveAndRestore X (AllowInverses, false );
63+
5864 beginManglingWithAutoDiffOriginalFunction (func);
5965 auto kind = Demangle::getAutoDiffFunctionKind (derivativeId->getKind ());
6066 auto *resultIndices =
@@ -71,13 +77,19 @@ class IRGenMangler : public Mangle::ASTMangler {
7177
7278 std::string mangleConstructorDispatchThunk (const ConstructorDecl *ctor,
7379 bool isAllocating) {
80+ // Dispatch thunks do not mangle inverse conformances.
81+ llvm::SaveAndRestore X (AllowInverses, false );
82+
7483 beginMangling ();
7584 appendConstructorEntity (ctor, isAllocating);
7685 appendOperator (" Tj" );
7786 return finalize ();
7887 }
7988
8089 std::string mangleMethodDescriptor (const FuncDecl *func) {
90+ // Method descriptors do not mangle inverse conformances.
91+ llvm::SaveAndRestore X (AllowInverses, false );
92+
8193 beginMangling ();
8294 appendEntity (func);
8395 appendOperator (" Tq" );
@@ -87,6 +99,9 @@ class IRGenMangler : public Mangle::ASTMangler {
8799 std::string mangleDerivativeMethodDescriptor (
88100 const AbstractFunctionDecl *func,
89101 AutoDiffDerivativeFunctionIdentifier *derivativeId) {
102+ // Method descriptors do not mangle inverse conformances.
103+ llvm::SaveAndRestore X (AllowInverses, false );
104+
90105 beginManglingWithAutoDiffOriginalFunction (func);
91106 auto kind = Demangle::getAutoDiffFunctionKind (derivativeId->getKind ());
92107 auto *resultIndices =
@@ -103,6 +118,9 @@ class IRGenMangler : public Mangle::ASTMangler {
103118
104119 std::string mangleConstructorMethodDescriptor (const ConstructorDecl *ctor,
105120 bool isAllocating) {
121+ // Method descriptors do not mangle inverse conformances.
122+ llvm::SaveAndRestore X (AllowInverses, false );
123+
106124 beginMangling ();
107125 appendConstructorEntity (ctor, isAllocating);
108126 appendOperator (" Tq" );
@@ -327,6 +345,10 @@ class IRGenMangler : public Mangle::ASTMangler {
327345 // among the type descriptors of different protocols.
328346 llvm::SaveAndRestore<bool > optimizeProtocolNames (OptimizeProtocolNames,
329347 false );
348+
349+ // No mangling of inverse conformances inside protocols.
350+ llvm::SaveAndRestore X (AllowInverses, false );
351+
330352 beginMangling ();
331353 bool isAssocTypeAtDepth = false ;
332354 (void )appendAssocType (
@@ -341,6 +363,9 @@ class IRGenMangler : public Mangle::ASTMangler {
341363 const ProtocolDecl *proto,
342364 CanType subject,
343365 const ProtocolDecl *requirement) {
366+ // No mangling of inverse conformances inside protocols.
367+ llvm::SaveAndRestore X (AllowInverses, false );
368+
344369 beginMangling ();
345370 appendAnyGenericType (proto);
346371 if (isa<GenericTypeParamType>(subject)) {
@@ -357,6 +382,9 @@ class IRGenMangler : public Mangle::ASTMangler {
357382 std::string mangleBaseConformanceDescriptor (
358383 const ProtocolDecl *proto,
359384 const ProtocolDecl *requirement) {
385+ // No mangling of inverse conformances inside protocols.
386+ llvm::SaveAndRestore X (AllowInverses, false );
387+
360388 beginMangling ();
361389 appendAnyGenericType (proto);
362390 appendProtocolName (requirement);
@@ -368,6 +396,9 @@ class IRGenMangler : public Mangle::ASTMangler {
368396 const ProtocolDecl *proto,
369397 CanType subject,
370398 const ProtocolDecl *requirement) {
399+ // No mangling of inverse conformances inside protocols.
400+ llvm::SaveAndRestore X (AllowInverses, false );
401+
371402 beginMangling ();
372403 appendAnyGenericType (proto);
373404 bool isFirstAssociatedTypeIdentifier = true ;
@@ -385,20 +416,27 @@ class IRGenMangler : public Mangle::ASTMangler {
385416 const RootProtocolConformance *conformance);
386417
387418 std::string manglePropertyDescriptor (const AbstractStorageDecl *storage) {
419+ llvm::SaveAndRestore X (AllowInverses, inversesAllowed (storage));
388420 beginMangling ();
389421 appendEntity (storage);
390422 appendOperator (" MV" );
391423 return finalize ();
392424 }
393425
394426 std::string mangleFieldOffset (const ValueDecl *Decl) {
427+ // No mangling of inverse conformances.
428+ llvm::SaveAndRestore X (AllowInverses, false );
429+
395430 beginMangling ();
396431 appendEntity (Decl);
397432 appendOperator (" Wvd" );
398433 return finalize ();
399434 }
400435
401436 std::string mangleEnumCase (const ValueDecl *Decl) {
437+ // No mangling of inverse conformances.
438+ llvm::SaveAndRestore X (AllowInverses, false );
439+
402440 beginMangling ();
403441 appendEntity (Decl);
404442 appendOperator (" WC" );
@@ -716,14 +754,7 @@ class IRGenMangler : public Mangle::ASTMangler {
716754
717755 std::string mangleConformanceSymbol (Type type,
718756 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);
727758};
728759
729760// / Determines if the minimum deployment target's runtime demangler will not
0 commit comments