Merge pull request #19483 from DougGregor/runtime-demangle-fixes
[Runtime] Fixes for demangling to metadata
diff --git a/docs/ABI/Mangling.rst b/docs/ABI/Mangling.rst
index cf33184..59fd471 100644
--- a/docs/ABI/Mangling.rst
+++ b/docs/ABI/Mangling.rst
@@ -64,7 +64,7 @@
global ::= context 'MXE' // extension descriptor
global ::= context 'MXX' // anonymous context descriptor
global ::= context identifier 'MXY' // anonymous context descriptor
- global ::= type assoc_type_path 'MXA' // generic parameter ref
+ global ::= type assoc-type-list 'MXA' // generic parameter ref
global ::= protocol 'Mp' // protocol descriptor
global ::= nominal-type 'Mo' // class metadata immediate member base offset
@@ -91,15 +91,13 @@
global ::= type protocol-conformance 'WL' // lazy protocol witness table cache variable
global ::= protocol-conformance identifier 'Wt' // associated type metadata accessor
- global ::= protocol-conformance assoc_type_path nominal-type 'WT' // associated type witness table accessor
+ global ::= protocol-conformance assoc-type-list nominal-type 'WT' // associated type witness table accessor
global ::= type protocol-conformance 'Wl' // lazy protocol witness table accessor
global ::= type 'WV' // value witness table
global ::= entity 'Wvd' // field offset
global ::= entity 'WC' // resilient enum tag index
- assoc_type_path ::= identifier '_' identifier*
-
A direct symbol resolves directly to the address of an object. An
indirect symbol resolves to the address of a pointer to the object.
They are distinct manglings to make a certain class of bugs
diff --git a/lib/Demangling/Demangler.cpp b/lib/Demangling/Demangler.cpp
index 9048834..e875a3e 100644
--- a/lib/Demangling/Demangler.cpp
+++ b/lib/Demangling/Demangler.cpp
@@ -1666,10 +1666,10 @@
bool firstElem = false;
do {
firstElem = (popNode(Node::Kind::FirstElementMarker) != nullptr);
- NodePointer AssocTyName = popNode(isDeclName);
- if (!AssocTyName)
+ NodePointer AssocTy = popAssocTypeName();
+ if (!AssocTy)
return nullptr;
- AssocTypePath->addChild(AssocTyName, *this);
+ AssocTypePath->addChild(AssocTy, *this);
} while (!firstElem);
AssocTypePath->reverseChildren();
return AssocTypePath;
diff --git a/lib/IRGen/GenDecl.cpp b/lib/IRGen/GenDecl.cpp
index 60c07f8..41f16b1 100644
--- a/lib/IRGen/GenDecl.cpp
+++ b/lib/IRGen/GenDecl.cpp
@@ -2453,135 +2453,6 @@
return var;
}
-namespace {
- /// Builds a protocol conformance descriptor.
- class ProtocolConformanceDescriptorBuilder {
- IRGenModule &IGM;
- ConstantStructBuilder &B;
- const NormalProtocolConformance *Conformance;
- ConformanceFlags Flags;
-
- public:
- ProtocolConformanceDescriptorBuilder(
- IRGenModule &IGM,
- ConstantStructBuilder &B,
- const NormalProtocolConformance *conformance)
- : IGM(IGM), B(B), Conformance(conformance) { }
-
- void layout() {
- addProtocol();
- addConformingType();
- addWitnessTable();
- addFlags();
- addContext();
- addConditionalRequirements();
-
- B.suggestType(IGM.ProtocolConformanceDescriptorTy);
- }
-
- void addProtocol() {
- // Relative reference to the protocol descriptor.
- auto protocol = Conformance->getProtocol();
- auto descriptorRef = IGM.getAddrOfLLVMVariableOrGOTEquivalent(
- LinkEntity::forProtocolDescriptor(protocol),
- IGM.getPointerAlignment(), IGM.ProtocolDescriptorStructTy);
- B.addRelativeAddress(descriptorRef);
- }
-
- void addConformingType() {
- // Add a relative reference to the type, with the type reference
- // kind stored in the flags.
- auto ref =
- IGM.getTypeEntityReference(Conformance->getType()->getAnyNominal());
- B.addRelativeAddress(ref.getValue());
- Flags = Flags.withTypeReferenceKind(ref.getKind());
- }
-
- void addWitnessTable() {
- using ConformanceKind = ConformanceFlags::ConformanceKind;
-
- // Figure out what kind of witness table we have.
- llvm::Constant *witnessTableVar;
-
- if (Conformance->getConditionalRequirements().empty()) {
- if (!isDependentConformance(Conformance) &&
- !Conformance->isSynthesizedNonUnique()) {
- Flags = Flags.withConformanceKind(ConformanceKind::WitnessTable);
- witnessTableVar = IGM.getAddrOfWitnessTable(Conformance);
- } else {
- Flags = Flags.withConformanceKind(
- ConformanceKind::WitnessTableAccessor);
- witnessTableVar = IGM.getAddrOfWitnessTableAccessFunction(
- Conformance, ForDefinition);
- }
- } else {
- Flags =
- Flags.withConformanceKind(
- ConformanceKind::ConditionalWitnessTableAccessor)
- .withNumConditionalRequirements(
- Conformance->getConditionalRequirements().size());
-
- witnessTableVar = IGM.getAddrOfWitnessTableAccessFunction(
- Conformance, ForDefinition);
- }
-
- // Relative reference to the witness table.
- auto witnessTableRef =
- ConstantReference(witnessTableVar, ConstantReference::Direct);
- B.addRelativeAddress(witnessTableRef);
- }
-
- void addFlags() {
- // Miscellaneous flags.
- Flags = Flags.withIsRetroactive(Conformance->isRetroactive());
- Flags =
- Flags.withIsSynthesizedNonUnique(Conformance->isSynthesizedNonUnique());
-
- // Add the flags.
- B.addInt32(Flags.getIntValue());
- }
-
- void addContext() {
- if (!Conformance->isRetroactive())
- return;
-
- auto moduleContext =
- Conformance->getDeclContext()->getModuleScopeContext();
- ConstantReference moduleContextRef =
- IGM.getAddrOfParentContextDescriptor(moduleContext);
- B.addRelativeAddress(moduleContextRef);
- }
-
- void addConditionalRequirements() {
- if (Conformance->getConditionalRequirements().empty())
- return;
-
- auto nominal = Conformance->getType()->getAnyNominal();
- irgen::addGenericRequirements(IGM, B,
- nominal->getGenericSignatureOfContext(),
- Conformance->getConditionalRequirements());
- }
- };
-}
-
-void IRGenModule::emitProtocolConformance(
- const NormalProtocolConformance *conformance) {
- // Emit additional metadata to be used by reflection.
- emitAssociatedTypeMetadataRecord(conformance);
-
- // Form the protocol conformance descriptor.
- ConstantInitBuilder initBuilder(*this);
- auto init = initBuilder.beginStruct();
- ProtocolConformanceDescriptorBuilder builder(*this, init, conformance);
- builder.layout();
-
- auto var =
- cast<llvm::GlobalVariable>(
- getAddrOfProtocolConformanceDescriptor(conformance,
- init.finishAndCreateFuture()));
- var->setConstant(true);
-}
-
void IRGenModule::addProtocolConformance(
const NormalProtocolConformance *conformance) {
// Add this protocol conformance.
diff --git a/lib/IRGen/GenProto.cpp b/lib/IRGen/GenProto.cpp
index a04e8ae..53a3f42 100644
--- a/lib/IRGen/GenProto.cpp
+++ b/lib/IRGen/GenProto.cpp
@@ -2196,6 +2196,135 @@
return fn;
}
+namespace {
+ /// Builds a protocol conformance descriptor.
+ class ProtocolConformanceDescriptorBuilder {
+ IRGenModule &IGM;
+ ConstantStructBuilder &B;
+ const NormalProtocolConformance *Conformance;
+ ConformanceFlags Flags;
+
+ public:
+ ProtocolConformanceDescriptorBuilder(
+ IRGenModule &IGM,
+ ConstantStructBuilder &B,
+ const NormalProtocolConformance *conformance)
+ : IGM(IGM), B(B), Conformance(conformance) { }
+
+ void layout() {
+ addProtocol();
+ addConformingType();
+ addWitnessTable();
+ addFlags();
+ addContext();
+ addConditionalRequirements();
+
+ B.suggestType(IGM.ProtocolConformanceDescriptorTy);
+ }
+
+ void addProtocol() {
+ // Relative reference to the protocol descriptor.
+ auto protocol = Conformance->getProtocol();
+ auto descriptorRef = IGM.getAddrOfLLVMVariableOrGOTEquivalent(
+ LinkEntity::forProtocolDescriptor(protocol),
+ IGM.getPointerAlignment(), IGM.ProtocolDescriptorStructTy);
+ B.addRelativeAddress(descriptorRef);
+ }
+
+ void addConformingType() {
+ // Add a relative reference to the type, with the type reference
+ // kind stored in the flags.
+ auto ref =
+ IGM.getTypeEntityReference(Conformance->getType()->getAnyNominal());
+ B.addRelativeAddress(ref.getValue());
+ Flags = Flags.withTypeReferenceKind(ref.getKind());
+ }
+
+ void addWitnessTable() {
+ using ConformanceKind = ConformanceFlags::ConformanceKind;
+
+ // Figure out what kind of witness table we have.
+ llvm::Constant *witnessTableVar;
+
+ if (Conformance->getConditionalRequirements().empty()) {
+ if (!isDependentConformance(Conformance) &&
+ !Conformance->isSynthesizedNonUnique()) {
+ Flags = Flags.withConformanceKind(ConformanceKind::WitnessTable);
+ witnessTableVar = IGM.getAddrOfWitnessTable(Conformance);
+ } else {
+ Flags = Flags.withConformanceKind(
+ ConformanceKind::WitnessTableAccessor);
+ witnessTableVar = IGM.getAddrOfWitnessTableAccessFunction(
+ Conformance, ForDefinition);
+ }
+ } else {
+ Flags =
+ Flags.withConformanceKind(
+ ConformanceKind::ConditionalWitnessTableAccessor)
+ .withNumConditionalRequirements(
+ Conformance->getConditionalRequirements().size());
+
+ witnessTableVar = IGM.getAddrOfWitnessTableAccessFunction(
+ Conformance, ForDefinition);
+ }
+
+ // Relative reference to the witness table.
+ auto witnessTableRef =
+ ConstantReference(witnessTableVar, ConstantReference::Direct);
+ B.addRelativeAddress(witnessTableRef);
+ }
+
+ void addFlags() {
+ // Miscellaneous flags.
+ Flags = Flags.withIsRetroactive(Conformance->isRetroactive());
+ Flags =
+ Flags.withIsSynthesizedNonUnique(Conformance->isSynthesizedNonUnique());
+
+ // Add the flags.
+ B.addInt32(Flags.getIntValue());
+ }
+
+ void addContext() {
+ if (!Conformance->isRetroactive())
+ return;
+
+ auto moduleContext =
+ Conformance->getDeclContext()->getModuleScopeContext();
+ ConstantReference moduleContextRef =
+ IGM.getAddrOfParentContextDescriptor(moduleContext);
+ B.addRelativeAddress(moduleContextRef);
+ }
+
+ void addConditionalRequirements() {
+ if (Conformance->getConditionalRequirements().empty())
+ return;
+
+ auto nominal = Conformance->getType()->getAnyNominal();
+ irgen::addGenericRequirements(IGM, B,
+ nominal->getGenericSignatureOfContext(),
+ Conformance->getConditionalRequirements());
+ }
+ };
+}
+
+void IRGenModule::emitProtocolConformance(
+ const NormalProtocolConformance *conformance) {
+ // Emit additional metadata to be used by reflection.
+ emitAssociatedTypeMetadataRecord(conformance);
+
+ // Form the protocol conformance descriptor.
+ ConstantInitBuilder initBuilder(*this);
+ auto init = initBuilder.beginStruct();
+ ProtocolConformanceDescriptorBuilder builder(*this, init, conformance);
+ builder.layout();
+
+ auto var =
+ cast<llvm::GlobalVariable>(
+ getAddrOfProtocolConformanceDescriptor(conformance,
+ init.finishAndCreateFuture()));
+ var->setConstant(true);
+}
+
void IRGenModule::ensureRelativeSymbolCollocation(SILWitnessTable &wt) {
// Only resilient conformances use relative pointers for witness methods.
if (wt.isDeclaration() || isAvailableExternally(wt.getLinkage()) ||
diff --git a/lib/IRGen/IRGenMangler.h b/lib/IRGen/IRGenMangler.h
index 37c5b95..a67c674 100644
--- a/lib/IRGen/IRGenMangler.h
+++ b/lib/IRGen/IRGenMangler.h
@@ -329,7 +329,7 @@
void appendAssociatedTypePath(CanType associatedType, bool &isFirst) {
if (auto memberType = dyn_cast<DependentMemberType>(associatedType)) {
appendAssociatedTypePath(memberType.getBase(), isFirst);
- appendIdentifier(memberType->getName().str());
+ appendAssociatedTypeName(memberType);
appendListSeparator(isFirst);
} else {
assert(isa<GenericTypeParamType>(associatedType));
diff --git a/stdlib/public/runtime/Demangle.cpp b/stdlib/public/runtime/Demangle.cpp
index 4d8f8ce..8f38a52 100644
--- a/stdlib/public/runtime/Demangle.cpp
+++ b/stdlib/public/runtime/Demangle.cpp
@@ -87,8 +87,8 @@
auto extension = llvm::cast<ExtensionContextDescriptor>(component);
// Demangle the extension self type.
auto selfType = Dem.demangleType(extension->getMangledExtendedContext());
- assert(selfType->getKind() == Node::Kind::Type);
- selfType = selfType->getChild(0);
+ if (selfType->getKind() == Node::Kind::Type)
+ selfType = selfType->getChild(0);
// Substitute in the generic arguments.
// TODO: This kludge only kinda works if there are no same-type
diff --git a/stdlib/public/runtime/MetadataLookup.cpp b/stdlib/public/runtime/MetadataLookup.cpp
index 2fe93ba..2bd51a2 100644
--- a/stdlib/public/runtime/MetadataLookup.cpp
+++ b/stdlib/public/runtime/MetadataLookup.cpp
@@ -1024,7 +1024,7 @@
auto accessFunction = typeDecl->getAccessFunction();
if (!accessFunction) return BuiltType();
- return accessFunction(MetadataState::Complete, allGenericArgs).Value;
+ return accessFunction(MetadataState::Abstract, allGenericArgs).Value;
}
BuiltType createBuiltinType(StringRef mangledName) const {
@@ -1102,7 +1102,7 @@
auto flags = TupleTypeFlags().withNumElements(elements.size());
if (!labels.empty())
flags = flags.withNonConstantLabels(true);
- return swift_getTupleTypeMetadata(MetadataState::Complete,
+ return swift_getTupleTypeMetadata(MetadataState::Abstract,
flags, elements.data(),
labels.empty() ? nullptr : labels.c_str(),
/*proposedWitnesses=*/nullptr).Value;
@@ -1189,10 +1189,8 @@
if (!assocTypeReqIndex) return nullptr;
// Call the associated type access function.
- // TODO: can we just request abstract metadata? If so, do we have
- // a responsibility to try to finish it later?
return ((AssociatedTypeAccessFunction * const *)witnessTable)[*assocTypeReqIndex]
- (MetadataState::Complete, base, witnessTable).Value;
+ (MetadataState::Abstract, base, witnessTable).Value;
});
auto type = Demangle::decodeMangledType(builder, node);
@@ -1205,7 +1203,7 @@
size_t *parametersPerLevel,
const Metadata * const *flatSubstitutions) {
llvm::StringRef typeName(typeNameStart, typeNameLength);
- return _getTypeByMangledName(typeName,
+ auto metadata = _getTypeByMangledName(typeName,
[&](unsigned depth, unsigned index) -> const Metadata * {
if (depth >= numberOfLevels)
return nullptr;
@@ -1219,6 +1217,10 @@
return flatSubstitutions[flatIndex];
});
+
+ if (!metadata) return nullptr;
+
+ return swift_checkMetadataState(MetadataState::Complete, metadata).Value;
}
#define OVERRIDE_METADATALOOKUP COMPATIBILITY_OVERRIDE
diff --git a/stdlib/public/runtime/Private.h b/stdlib/public/runtime/Private.h
index 55030f7..8bb49a0 100644
--- a/stdlib/public/runtime/Private.h
+++ b/stdlib/public/runtime/Private.h
@@ -69,6 +69,10 @@
bool isWeak() const { return ReferenceOwnership.isWeak(); }
bool isUnowned() const { return ReferenceOwnership.isUnowned(); }
bool isUnmanaged() const { return ReferenceOwnership.isUnmanaged(); }
+
+ TypeReferenceOwnership getReferenceOwnership() const {
+ return ReferenceOwnership;
+ }
};
#if SWIFT_HAS_ISA_MASKING
diff --git a/stdlib/public/runtime/ProtocolConformance.cpp b/stdlib/public/runtime/ProtocolConformance.cpp
index b00ec95..9412326 100644
--- a/stdlib/public/runtime/ProtocolConformance.cpp
+++ b/stdlib/public/runtime/ProtocolConformance.cpp
@@ -689,12 +689,10 @@
protocolDescriptor->getRequirements().data();
// Call the associated type access function.
- using AssociatedTypeAccessFn =
- const Metadata *(*)(const Metadata *base, const WitnessTable *);
unsigned adjustedIndex = index + WitnessTableFirstRequirementOffset;
current =
- ((const AssociatedTypeAccessFn *)witnessTable)[adjustedIndex]
- (current, witnessTable);
+ ((AssociatedTypeAccessFunction * const *)witnessTable)[adjustedIndex]
+ (MetadataState::Abstract, current, witnessTable).Value;
if (!current) return nullptr;
}
@@ -766,6 +764,8 @@
// Check whether it's dynamically castable, which works as a superclass
// check.
+ // FIXME: We should be explicitly checking the superclass, so we
+ // don't require the subject type to be complete.
if (!swift_dynamicCastMetatype(subjectType, baseType)) return true;
continue;
diff --git a/stdlib/public/runtime/ReflectionMirror.mm b/stdlib/public/runtime/ReflectionMirror.mm
index a963df1..db84d00 100644
--- a/stdlib/public/runtime/ReflectionMirror.mm
+++ b/stdlib/public/runtime/ReflectionMirror.mm
@@ -371,6 +371,13 @@
return base->getGenericArgs()[flatIndex];
});
+ // Complete the type metadata before returning it to the caller.
+ if (typeInfo) {
+ typeInfo = TypeInfo(swift_checkMetadataState(MetadataState::Complete,
+ typeInfo).Value,
+ typeInfo.getReferenceOwnership());
+ }
+
// If demangling the type failed, pretend it's an empty type instead with
// a log message.
if (typeInfo == nullptr) {
diff --git a/test/IRGen/associated_type_witness.swift b/test/IRGen/associated_type_witness.swift
index 7a5bf5e..aa6cdba 100644
--- a/test/IRGen/associated_type_witness.swift
+++ b/test/IRGen/associated_type_witness.swift
@@ -53,8 +53,8 @@
// Witness table for Fulfilled : Assocked.
// GLOBAL-LABEL: @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAAWp" = internal constant [4 x i8*] [
// GLOBAL-SAME: @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAAMc"
-// GLOBAL-SAME: i8* bitcast (i8** (%swift.type*, %swift.type*, i8**)* @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAA5Assoc_AA1PPWT" to i8*)
-// GLOBAL-SAME: i8* bitcast (i8** (%swift.type*, %swift.type*, i8**)* @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAA5Assoc_AA1QPWT" to i8*)
+// GLOBAL-SAME: i8* bitcast (i8** (%swift.type*, %swift.type*, i8**)* @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAA5AssocAaEP_AA1PPWT" to i8*)
+// GLOBAL-SAME: i8* bitcast (i8** (%swift.type*, %swift.type*, i8**)* @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAA5AssocAaEP_AA1QPWT" to i8*)
// GLOBAL-SAME: i8* bitcast (%swift.metadata_response (i64, %swift.type*, i8**)* @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAA5AssocWt" to i8*)
// GLOBAL-SAME: ]
struct Fulfilled<T : P & Q> : Assocked {
@@ -62,14 +62,14 @@
}
// Associated type witness table access function for Fulfilled.Assoc : P.
-// CHECK-LABEL: define internal swiftcc i8** @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAA5Assoc_AA1PPWT"(%swift.type* %"Fulfilled<T>.Assoc", %swift.type* %"Fulfilled<T>", i8** %"Fulfilled<T>.Assocked")
+// CHECK-LABEL: define internal swiftcc i8** @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAA5AssocAaEP_AA1PPWT"(%swift.type* %"Fulfilled<T>.Assoc", %swift.type* %"Fulfilled<T>", i8** %"Fulfilled<T>.Assocked")
// CHECK: [[T0:%.*]] = bitcast %swift.type* %"Fulfilled<T>" to i8***
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8**, i8*** [[T0]], i64 3
// CHECK-NEXT: [[T2:%.*]] = load i8**, i8*** [[T1]], align 8, !invariant.load
// CHECK-NEXT: ret i8** [[T2]]
// Associated type witness table access function for Fulfilled.Assoc : Q.
-// CHECK-LABEL: define internal swiftcc i8** @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAA5Assoc_AA1QPWT"(%swift.type* %"Fulfilled<T>.Assoc", %swift.type* %"Fulfilled<T>", i8** %"Fulfilled<T>.Assocked")
+// CHECK-LABEL: define internal swiftcc i8** @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAA5AssocAaEP_AA1QPWT"(%swift.type* %"Fulfilled<T>.Assoc", %swift.type* %"Fulfilled<T>", i8** %"Fulfilled<T>.Assocked")
// CHECK: [[T0:%.*]] = bitcast %swift.type* %"Fulfilled<T>" to i8***
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8**, i8*** [[T0]], i64 4
// CHECK-NEXT: [[T2:%.*]] = load i8**, i8*** [[T1]], align 8, !invariant.load
diff --git a/test/IRGen/protocol_resilience.sil b/test/IRGen/protocol_resilience.sil
index ebdfab0..ad4389b 100644
--- a/test/IRGen/protocol_resilience.sil
+++ b/test/IRGen/protocol_resilience.sil
@@ -51,7 +51,7 @@
// Requirement signature
// CHECK-SAME: i32 128,
-// CHECK-SAME: @"$sx1T_MXA"
+// CHECK-SAME: @"$sx1T19protocol_resilience17ResilientProtocolP_MXA"
// CHECK-SAME: @"$s19protocol_resilience17ResilientProtocolMp"
// Protocol requirements
diff --git a/test/IRGen/protocol_resilience_descriptors.swift b/test/IRGen/protocol_resilience_descriptors.swift
index 22d19f3..ccf9acc 100644
--- a/test/IRGen/protocol_resilience_descriptors.swift
+++ b/test/IRGen/protocol_resilience_descriptors.swift
@@ -14,7 +14,7 @@
// Protocol descriptor
// CHECK-DEFINITION-LABEL: @"$s18resilient_protocol29ProtocolWithAssocTypeDefaultsMp" ={{( protected)?}} constant
-// CHECK-DEFINITION-SAME: @"$s18resilient_protocol29ProtocolWithAssocTypeDefaultsP2T2_AA014OtherResilientC0TN"
+// CHECK-DEFINITION-SAME: @"$s18resilient_protocol29ProtocolWithAssocTypeDefaultsP2T2AC_AA014OtherResilientC0TN"
// CHECK-DEFINITION-SAME: $s2T118resilient_protocol29ProtocolWithAssocTypeDefaultsPTM
// CHECK-DEFINITION-SAME: $s2T218resilient_protocol29ProtocolWithAssocTypeDefaultsPTM
@@ -24,10 +24,10 @@
// Associated type and conformance
// CHECK-DEFINITION: @"$s1T18resilient_protocol24ProtocolWithRequirementsPTl" ={{( dllexport)?}}{{( protected)?}} alias
-// CHECK-DEFINITION: @"$s18resilient_protocol29ProtocolWithAssocTypeDefaultsP2T2_AA014OtherResilientC0Tn" ={{( dllexport)?}}{{( protected)?}} alias
+// CHECK-DEFINITION: @"$s18resilient_protocol29ProtocolWithAssocTypeDefaultsP2T2AC_AA014OtherResilientC0Tn" ={{( dllexport)?}}{{( protected)?}} alias
// Default associated conformance witnesses
-// CHECK-DEFINITION-LABEL: define internal swiftcc i8** @"$s18resilient_protocol29ProtocolWithAssocTypeDefaultsP2T2_AA014OtherResilientC0TN"
+// CHECK-DEFINITION-LABEL: define internal swiftcc i8** @"$s18resilient_protocol29ProtocolWithAssocTypeDefaultsP2T2AC_AA014OtherResilientC0TN"
// Default associated type witnesses
// CHECK-DEFINITION-LABEL: define internal swiftcc %swift.metadata_response @"$s2T118resilient_protocol29ProtocolWithAssocTypeDefaultsPTM"
@@ -58,15 +58,15 @@
public struct Y { }
// CHECK-USAGE: @"$s31protocol_resilience_descriptors29ConformsWithAssocRequirementsV010resilient_A008ProtocoleF12TypeDefaultsAAWr" = internal
-// CHECK-USAGE-SAME: $s18resilient_protocol29ProtocolWithAssocTypeDefaultsP2T2_AA014OtherResilientC0Tn
-// CHECK-USAGE-SAME: $s31protocol_resilience_descriptors29ConformsWithAssocRequirementsV010resilient_A008ProtocoleF12TypeDefaultsAA2T2_AD014OtherResilientI0PWT
+// CHECK-USAGE-SAME: $s18resilient_protocol29ProtocolWithAssocTypeDefaultsP2T2AC_AA014OtherResilientC0Tn
+// CHECK-USAGE-SAME: $s31protocol_resilience_descriptors29ConformsWithAssocRequirementsV010resilient_A008ProtocoleF12TypeDefaultsAA2T2AdEP_AD014OtherResilientI0PWT
public struct ConformsWithAssocRequirements : ProtocolWithAssocTypeDefaults {
}
-// CHECK-USAGE: @"$sx1T_MXA" =
+// CHECK-USAGE: @"$sx1T18resilient_protocol24ProtocolWithRequirementsP_MXA" =
// CHECK-USAGE-SAME: i32 0
// CHECK-USAGE-SAME: @"{{got.|__imp_}}$s18resilient_protocol24ProtocolWithRequirementsMp"
-// CHECK-USAGE-SAME: @"$sx1T_MXA"
+// CHECK-USAGE-SAME: @"$sx1T18resilient_protocol24ProtocolWithRequirementsP_MXA"
// CHECK-USAGE-SAME: %swift.protocol_requirement** @"{{got.|__imp_}}$s1T18resilient_protocol24ProtocolWithRequirementsPTl"
// CHECK-USAGE: @"$s31protocol_resilience_descriptors21ConditionallyConformsVyxG010resilient_A024ProtocolWithRequirementsAaeFRzAA1YV1TRtzlMc"