Skip to content

Commit b1d5302

Browse files
committed
Fix opaque type archetype emission for nested archetypes
1 parent 452ecca commit b1d5302

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

lib/IRGen/GenArchetype.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ irgen::emitArchetypeTypeMetadataRef(IRGenFunction &IGF,
6666
// If this is an opaque archetype, we'll need to instantiate using its
6767
// descriptor.
6868
if (auto opaque = dyn_cast<OpaqueTypeArchetypeType>(archetype)) {
69-
return emitOpaqueTypeMetadataRef(IGF, opaque, request);
69+
if (opaque->isRoot())
70+
return emitOpaqueTypeMetadataRef(IGF, opaque, request);
7071
}
7172

7273
// If there's no local or opaque metadata, it must be a nested type.
@@ -508,9 +509,11 @@ MetadataResponse irgen::emitOpaqueTypeMetadataRef(IRGenFunction &IGF,
508509
DynamicMetadataRequest request) {
509510
auto accessorFn = IGF.IGM.getGetOpaqueTypeMetadataFn();
510511
auto opaqueDecl = archetype->getDecl();
511-
512+
auto genericParam = archetype->getInterfaceType()
513+
->castTo<GenericTypeParamType>();
512514
auto *descriptor = getAddressOfOpaqueTypeDescriptor(IGF, opaqueDecl);
513-
auto indexValue = llvm::ConstantInt::get(IGF.IGM.SizeTy, 0);
515+
auto indexValue = llvm::ConstantInt::get(
516+
IGF.IGM.SizeTy, genericParam->getIndex());
514517

515518
llvm::CallInst *result = nullptr;
516519
withOpaqueTypeGenericArgs(IGF, archetype,

0 commit comments

Comments
 (0)