void TypeChecker::markInvalidGenericSignature(ValueDecl *VD) { GenericParamList *genericParams; if (auto *AFD = dyn_cast<AbstractFunctionDecl>(VD)) genericParams = AFD->getGenericParams(); else genericParams = cast<GenericTypeDecl>(VD)->getGenericParams(); // If there aren't any generic parameters at this level, we're done. if (genericParams == nullptr) return; DeclContext *DC = VD->getDeclContext(); ArchetypeBuilder builder = createArchetypeBuilder(DC->getParentModule()); if (auto sig = DC->getGenericSignatureOfContext()) builder.addGenericSignature(sig, true); // Visit each of the generic parameters. for (auto param : *genericParams) builder.addGenericParameter(param); // Wire up the archetypes. for (auto GP : *genericParams) GP->setArchetype(builder.getArchetype(GP)); genericParams->setAllArchetypes( Context.AllocateCopy(builder.getAllArchetypes())); }
/// Finalize the given generic parameter list, assigning archetypes to /// the generic parameters. void TypeChecker::finalizeGenericParamList(ArchetypeBuilder &builder, GenericParamList *genericParams, DeclContext *dc) { Accessibility access; if (auto *fd = dyn_cast<FuncDecl>(dc)) access = fd->getFormalAccess(); else if (auto *nominal = dyn_cast<NominalTypeDecl>(dc)) access = nominal->getFormalAccess(); else access = Accessibility::Internal; // Wire up the archetypes. for (auto GP : *genericParams) { GP->setArchetype(builder.getArchetype(GP)); checkInheritanceClause(GP); if (!GP->hasAccessibility()) GP->setAccessibility(access); } genericParams->setAllArchetypes( Context.AllocateCopy(builder.getAllArchetypes())); #ifndef NDEBUG // Record archetype contexts. for (auto archetype : genericParams->getAllArchetypes()) { if (Context.ArchetypeContexts.count(archetype) == 0) Context.ArchetypeContexts[archetype] = dc; } #endif // Replace the generic parameters with their archetypes throughout the // types in the requirements. // FIXME: This should not be necessary at this level; it is a transitional // step. for (auto &Req : genericParams->getRequirements()) { if (Req.isInvalid()) continue; switch (Req.getKind()) { case RequirementReprKind::TypeConstraint: { revertDependentTypeLoc(Req.getSubjectLoc()); if (validateType(Req.getSubjectLoc(), dc)) { Req.setInvalid(); continue; } revertDependentTypeLoc(Req.getConstraintLoc()); if (validateType(Req.getConstraintLoc(), dc)) { Req.setInvalid(); continue; } break; } case RequirementReprKind::SameType: revertDependentTypeLoc(Req.getFirstTypeLoc()); if (validateType(Req.getFirstTypeLoc(), dc)) { Req.setInvalid(); continue; } revertDependentTypeLoc(Req.getSecondTypeLoc()); if (validateType(Req.getSecondTypeLoc(), dc)) { Req.setInvalid(); continue; } break; } } }