@@ -1958,37 +1958,50 @@ class DecodedMetadataBuilder {
19581958 return BuiltType ();
19591959#endif
19601960
1961- // FIXME: variadic-generics
1962-
19631961 auto swiftProtocol = protocol.getSwiftProtocol ();
1964- auto witnessTable = swift_conformsToProtocol (base.getMetadata (), swiftProtocol);
1965- if (!witnessTable)
1966- return BuiltType ();
19671962
19681963 // Look for the named associated type within the protocol.
19691964 auto assocType = findAssociatedTypeByName (swiftProtocol, name);
19701965 if (!assocType) return BuiltType ();
19711966
1972- // Call the associated type access function.
1973- #if SWIFT_STDLIB_USE_RELATIVE_PROTOCOL_WITNESS_TABLES
1974- auto tbl = reinterpret_cast <RelativeWitnessTable *>(
1975- const_cast <WitnessTable *>(witnessTable));
1976- return BuiltType (
1977- swift_getAssociatedTypeWitnessRelative (
1978- MetadataState::Abstract,
1979- tbl,
1980- base.getMetadata (),
1981- swiftProtocol->getRequirementBaseDescriptor (),
1982- *assocType));
1983- #else
1984- return BuiltType (
1985- swift_getAssociatedTypeWitness (
1986- MetadataState::Abstract,
1987- const_cast <WitnessTable *>(witnessTable),
1988- base.getMetadata (),
1989- swiftProtocol->getRequirementBaseDescriptor (),
1990- *assocType));
1991- #endif
1967+ auto projectDependentMemberType = [&](const Metadata *baseMetadata) -> const Metadata * {
1968+ auto witnessTable = swift_conformsToProtocol (baseMetadata, swiftProtocol);
1969+ if (!witnessTable)
1970+ return nullptr ;
1971+
1972+ // Call the associated type access function.
1973+ #if SWIFT_STDLIB_USE_RELATIVE_PROTOCOL_WITNESS_TABLES
1974+ auto tbl = reinterpret_cast <RelativeWitnessTable *>(
1975+ const_cast <WitnessTable *>(witnessTable));
1976+ return swift_getAssociatedTypeWitnessRelative (
1977+ MetadataState::Abstract,
1978+ tbl,
1979+ baseMetadata,
1980+ swiftProtocol->getRequirementBaseDescriptor (),
1981+ *assocType).Value ;
1982+ #else
1983+ return swift_getAssociatedTypeWitness (
1984+ MetadataState::Abstract,
1985+ const_cast <WitnessTable *>(witnessTable),
1986+ baseMetadata,
1987+ swiftProtocol->getRequirementBaseDescriptor (),
1988+ *assocType).Value ;
1989+ #endif
1990+ };
1991+
1992+ if (base.isMetadata ()) {
1993+ return BuiltType (projectDependentMemberType (base.getMetadata ()));
1994+ } else {
1995+ MetadataPackPointer basePack = base.getMetadataPack ();
1996+
1997+ llvm::SmallVector<const Metadata *, 4 > packElts;
1998+ for (size_t i = 0 , e = basePack.getNumElements (); i < e; ++i) {
1999+ auto *projectedElt = projectDependentMemberType (basePack.getElements ()[i]);
2000+ packElts.push_back (projectedElt);
2001+ }
2002+
2003+ return BuiltType (swift_allocateMetadataPack (packElts.data (), packElts.size ()));
2004+ }
19922005 }
19932006
19942007#define REF_STORAGE (Name, ...) \
0 commit comments