/// Checks if a generic callee and caller have compatible layout constraints. static bool isCallerAndCalleeLayoutConstraintsCompatible(FullApplySite AI) { SILFunction *Callee = AI.getReferencedFunction(); auto CalleeSig = Callee->getLoweredFunctionType()->getGenericSignature(); auto AISubs = AI.getSubstitutionMap(); SmallVector<GenericTypeParamType *, 4> SubstParams; CalleeSig->forEachParam([&](GenericTypeParamType *Param, bool Canonical) { if (Canonical) SubstParams.push_back(Param); }); for (auto Param : SubstParams) { // Map the parameter into context auto ContextTy = Callee->mapTypeIntoContext(Param->getCanonicalType()); auto Archetype = ContextTy->getAs<ArchetypeType>(); if (!Archetype) continue; auto Layout = Archetype->getLayoutConstraint(); if (!Layout) continue; // The generic parameter has a layout constraint. // Check that the substitution has the same constraint. auto AIReplacement = Type(Param).subst(AISubs); auto AIArchetype = AIReplacement->getAs<ArchetypeType>(); if (!AIArchetype) return false; auto AILayout = AIArchetype->getLayoutConstraint(); if (!AILayout) return false; if (AILayout != Layout) return false; } return true; }
void HttpParserImpl::forEachParam(EnumrateCallback&& cb) { forEachParam(cb); }