Skip to content

Commit 67cd031

Browse files
authored
Merge pull request #28236 from CodaFi/parametric-monomorphism
2 parents f3b2430 + 53015f5 commit 67cd031

File tree

5 files changed

+34
-51
lines changed

5 files changed

+34
-51
lines changed

include/swift/Subsystems.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,8 +228,7 @@ namespace swift {
228228
bool ProduceDiagnostics = true);
229229

230230
/// Expose TypeChecker's handling of GenericParamList to SIL parsing.
231-
GenericEnvironment *handleSILGenericParams(ASTContext &Ctx,
232-
GenericParamList *genericParams,
231+
GenericEnvironment *handleSILGenericParams(GenericParamList *genericParams,
233232
DeclContext *DC);
234233

235234
/// Turn the given module into SIL IR.

lib/ParseSIL/ParseSIL.cpp

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,34 +1281,29 @@ bool SILParser::parseSILType(SILType &Result,
12811281

12821282
// Resolve the generic environments for parsed generic function and box types.
12831283
class HandleSILGenericParamsWalker : public ASTWalker {
1284-
ASTContext &C;
12851284
SourceFile *SF;
12861285
public:
1287-
HandleSILGenericParamsWalker(ASTContext &C,
1288-
SourceFile *SF)
1289-
: C(C), SF(SF)
1290-
{}
1291-
1286+
HandleSILGenericParamsWalker(SourceFile *SF) : SF(SF) {}
1287+
12921288
bool walkToTypeReprPre(TypeRepr *T) override {
12931289
if (auto fnType = dyn_cast<FunctionTypeRepr>(T)) {
12941290
if (auto generics = fnType->getGenericParams()) {
1295-
auto env = handleSILGenericParams(C, generics, SF);
1291+
auto env = handleSILGenericParams(generics, SF);
12961292
fnType->setGenericEnvironment(env);
12971293
}
12981294
}
12991295
if (auto boxType = dyn_cast<SILBoxTypeRepr>(T)) {
13001296
if (auto generics = boxType->getGenericParams()) {
1301-
auto env = handleSILGenericParams(C, generics, SF);
1297+
auto env = handleSILGenericParams(generics, SF);
13021298
boxType->setGenericEnvironment(env);
13031299
}
13041300
}
13051301
return true;
13061302
}
13071303
};
13081304

1309-
TyR.get()
1310-
->walk(HandleSILGenericParamsWalker(P.Context, &P.SF));
1311-
1305+
TyR.get()->walk(HandleSILGenericParamsWalker(&P.SF));
1306+
13121307
// Save the top-level function generic environment if there was one.
13131308
if (auto fnType = dyn_cast<FunctionTypeRepr>(TyR.get()))
13141309
if (auto env = fnType->getGenericEnvironment())
@@ -2039,7 +2034,7 @@ bool SILParser::parseSILDeclRef(SILDeclRef &Member, bool FnTypeRequired) {
20392034
if (auto generics = fnType->getGenericParams()) {
20402035
assert(!Ty.wasValidated() && Ty.getType().isNull());
20412036

2042-
genericEnv = handleSILGenericParams(P.Context, generics, &P.SF);
2037+
genericEnv = handleSILGenericParams(generics, &P.SF);
20432038
fnType->setGenericEnvironment(genericEnv);
20442039
}
20452040
}
@@ -3108,8 +3103,8 @@ bool SILParser::parseSILInstruction(SILBuilder &B) {
31083103
{
31093104
Scope genericsScope(&P, ScopeKind::Generics);
31103105
generics = P.maybeParseGenericParams().getPtrOrNull();
3111-
patternEnv = handleSILGenericParams(P.Context, generics, &P.SF);
3112-
3106+
patternEnv = handleSILGenericParams(generics, &P.SF);
3107+
31133108
if (P.parseToken(tok::l_paren, diag::expected_tok_in_sil_instr, "("))
31143109
return true;
31153110

@@ -5717,8 +5712,8 @@ bool SILParserTUState::parseSILProperty(Parser &P) {
57175712
Scope toplevelScope(&P, ScopeKind::TopLevel);
57185713
Scope genericsScope(&P, ScopeKind::Generics);
57195714
generics = P.maybeParseGenericParams().getPtrOrNull();
5720-
patternEnv = handleSILGenericParams(P.Context, generics, &P.SF);
5721-
5715+
patternEnv = handleSILGenericParams(generics, &P.SF);
5716+
57225717
if (patternEnv) {
57235718
if (patternEnv->getGenericSignature()->getCanonicalSignature()
57245719
!= VD->getInnermostDeclContext()->getGenericSignatureOfContext()
@@ -6028,7 +6023,7 @@ ProtocolConformanceRef SILParser::parseProtocolConformance(
60286023

60296024
auto *genericParams = P.maybeParseGenericParams().getPtrOrNull();
60306025
if (genericParams) {
6031-
genericEnv = handleSILGenericParams(P.Context, genericParams, &P.SF);
6026+
genericEnv = handleSILGenericParams(genericParams, &P.SF);
60326027
}
60336028

60346029
auto retVal = parseProtocolConformanceHelper(proto, genericEnv, context,

lib/Sema/TypeCheckDecl.cpp

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -634,32 +634,6 @@ HasCircularRawValueRequest::evaluate(Evaluator &evaluator,
634634
return result;
635635
}
636636

637-
/// Expose TypeChecker's handling of GenericParamList to SIL parsing.
638-
GenericEnvironment *
639-
TypeChecker::handleSILGenericParams(GenericParamList *genericParams,
640-
DeclContext *DC) {
641-
if (genericParams == nullptr)
642-
return nullptr;
643-
644-
SmallVector<GenericParamList *, 2> nestedList;
645-
for (; genericParams; genericParams = genericParams->getOuterParameters()) {
646-
nestedList.push_back(genericParams);
647-
}
648-
649-
std::reverse(nestedList.begin(), nestedList.end());
650-
651-
for (unsigned i = 0, e = nestedList.size(); i < e; ++i) {
652-
auto genericParams = nestedList[i];
653-
genericParams->setDepth(i);
654-
}
655-
656-
auto sig = TypeChecker::checkGenericSignature(
657-
nestedList.back(), DC,
658-
/*parentSig=*/nullptr,
659-
/*allowConcreteGenericParams=*/true);
660-
return (sig ? sig->getGenericEnvironment() : nullptr);
661-
}
662-
663637
/// Check whether \c current is a redeclaration.
664638
static void checkRedeclaration(ASTContext &ctx, ValueDecl *current) {
665639
// If we've already checked this declaration, don't do it again.

lib/Sema/TypeChecker.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -554,9 +554,28 @@ bool swift::performTypeLocChecking(ASTContext &Ctx, TypeLoc &T,
554554

555555
/// Expose TypeChecker's handling of GenericParamList to SIL parsing.
556556
GenericEnvironment *
557-
swift::handleSILGenericParams(ASTContext &Ctx, GenericParamList *genericParams,
557+
swift::handleSILGenericParams(GenericParamList *genericParams,
558558
DeclContext *DC) {
559-
return TypeChecker::handleSILGenericParams(genericParams, DC);
559+
if (genericParams == nullptr)
560+
return nullptr;
561+
562+
SmallVector<GenericParamList *, 2> nestedList;
563+
for (; genericParams; genericParams = genericParams->getOuterParameters()) {
564+
nestedList.push_back(genericParams);
565+
}
566+
567+
std::reverse(nestedList.begin(), nestedList.end());
568+
569+
for (unsigned i = 0, e = nestedList.size(); i < e; ++i) {
570+
auto genericParams = nestedList[i];
571+
genericParams->setDepth(i);
572+
}
573+
574+
auto sig =
575+
TypeChecker::checkGenericSignature(nestedList.back(), DC,
576+
/*parentSig=*/nullptr,
577+
/*allowConcreteGenericParams=*/true);
578+
return (sig ? sig->getGenericEnvironment() : nullptr);
560579
}
561580

562581
void swift::typeCheckPatternBinding(PatternBindingDecl *PBD,

lib/Sema/TypeChecker.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -613,10 +613,6 @@ class TypeChecker final {
613613
static void checkUnsupportedProtocolType(ASTContext &ctx,
614614
GenericParamList *genericParams);
615615

616-
/// Expose TypeChecker's handling of GenericParamList to SIL parsing.
617-
static GenericEnvironment *
618-
handleSILGenericParams(GenericParamList *genericParams, DeclContext *DC);
619-
620616
/// Resolve a reference to the given type declaration within a particular
621617
/// context.
622618
///

0 commit comments

Comments
 (0)