Skip to content

Commit 4e84d28

Browse files
committed
SIL: Build substitution signature without expanding defaults or applying inverses
1 parent 366f741 commit 4e84d28

File tree

7 files changed

+34
-31
lines changed

7 files changed

+34
-31
lines changed

include/swift/AST/TypeCheckRequests.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2007,7 +2007,7 @@ class InferredGenericSignatureRequest :
20072007
WhereClauseOwner,
20082008
SmallVector<Requirement, 2>,
20092009
SmallVector<TypeLoc, 2>,
2010-
bool),
2010+
bool, bool),
20112011
RequestFlags::Cached> {
20122012
public:
20132013
using SimpleRequest::SimpleRequest;
@@ -2023,7 +2023,7 @@ class InferredGenericSignatureRequest :
20232023
WhereClauseOwner whereClause,
20242024
SmallVector<Requirement, 2> addedRequirements,
20252025
SmallVector<TypeLoc, 2> inferenceSources,
2026-
bool allowConcreteGenericParams) const;
2026+
bool isExtension, bool allowInverses) const;
20272027

20282028
public:
20292029
// Separate caching.

include/swift/Subsystems.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,8 @@ namespace swift {
190190

191191
/// Expose TypeChecker's handling of GenericParamList to SIL parsing.
192192
GenericSignature handleSILGenericParams(GenericParamList *genericParams,
193-
DeclContext *DC);
193+
DeclContext *DC,
194+
bool allowInverses=true);
194195

195196
/// Turn the given module into SIL IR.
196197
///

lib/AST/RequirementMachine/RequirementMachineRequests.cpp

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -748,13 +748,19 @@ InferredGenericSignatureRequest::evaluate(
748748
WhereClauseOwner whereClause,
749749
SmallVector<Requirement, 2> addedRequirements,
750750
SmallVector<TypeLoc, 2> inferenceSources,
751-
bool allowConcreteGenericParams) const {
751+
bool isExtension, bool allowInverses) const {
752752
GenericSignature parentSig(parentSigImpl);
753753

754754
SmallVector<GenericTypeParamType *, 4> genericParams(
755755
parentSig.getGenericParams().begin(),
756756
parentSig.getGenericParams().end());
757757

758+
unsigned numOuterParams = genericParams.size();
759+
if (isExtension) {
760+
assert(allowInverses);
761+
numOuterParams = 0;
762+
}
763+
758764
SmallVector<StructuralRequirement, 2> requirements;
759765
SmallVector<RequirementError, 2> errors;
760766
SmallVector<InverseRequirement, 2> inverses;
@@ -791,12 +797,9 @@ InferredGenericSignatureRequest::evaluate(
791797
return false;
792798
};
793799

794-
// "Local" generic parameters to which we apply default Copyable and
795-
// Escapable.
796-
SmallVector<Type, 4> paramTypes;
797-
798800
if (genericParamList) {
799-
// Extensions never have a parent signature.
801+
// If we have multiple parameter lists, we're in SIL mode, and there's
802+
// no parent signature from context.
800803
assert(genericParamList->getOuterParameters() == nullptr || !parentSig);
801804

802805
// Collect all outer generic parameter lists.
@@ -811,10 +814,6 @@ InferredGenericSignatureRequest::evaluate(
811814
// We walk them backwards to order outer parameters before inner
812815
// parameters.
813816
for (auto *gpList : llvm::reverse(gpLists)) {
814-
for (auto *gpDecl : *gpList) {
815-
paramTypes.push_back(gpDecl->getDeclaredInterfaceType());
816-
}
817-
818817
assert(gpList->size() > 0 &&
819818
"Parsed an empty generic parameter list?");
820819

@@ -872,14 +871,13 @@ InferredGenericSignatureRequest::evaluate(
872871

873872
desugarRequirements(requirements, inverses, errors);
874873

875-
if (!genericParamList && allowConcreteGenericParams) {
876-
for (auto paramTy : genericParams) {
877-
paramTypes.push_back(paramTy);
878-
}
879-
}
880-
881874
// After realizing requirements, expand default requirements only for local
882875
// generic parameters, as the outer parameters have already been expanded.
876+
SmallVector<Type, 4> paramTypes;
877+
if (allowInverses) {
878+
paramTypes.append(genericParams.begin() + numOuterParams, genericParams.end());
879+
}
880+
883881
InverseRequirement::expandDefaults(ctx, paramTypes, requirements);
884882
applyInverses(ctx, paramTypes, inverses, requirements, errors);
885883

@@ -947,7 +945,7 @@ InferredGenericSignatureRequest::evaluate(
947945
if (attempt == 0) {
948946
machine->computeRequirementDiagnostics(errors, inverses, loc);
949947
diagnoseRequirementErrors(ctx, errors,
950-
(allowConcreteGenericParams || !genericParamList)
948+
(isExtension || !genericParamList)
951949
? AllowConcreteTypePolicy::All
952950
: AllowConcreteTypePolicy::AssocTypes);
953951
}
@@ -978,7 +976,7 @@ InferredGenericSignatureRequest::evaluate(
978976
std::move(machine));
979977
}
980978

981-
if (genericParamList && !allowConcreteGenericParams) {
979+
if (genericParamList && !isExtension) {
982980
for (auto genericParam : result.getInnermostGenericParams()) {
983981
auto reduced = result.getReducedType(genericParam);
984982

lib/SIL/Parser/ParseSIL.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1075,7 +1075,8 @@ void SILParser::bindSILGenericParams(TypeRepr *TyR) {
10751075
}
10761076

10771077
if (auto *genericParams = fnType->getPatternGenericParams()) {
1078-
auto sig = handleSILGenericParams(genericParams, SF);
1078+
auto sig = handleSILGenericParams(genericParams, SF,
1079+
/*allowInverses=*/false);
10791080
fnType->setPatternGenericSignature(sig);
10801081
}
10811082
}

lib/Sema/TypeCheckAttr.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3073,7 +3073,8 @@ SerializeAttrGenericSignatureRequest::evaluate(Evaluator &evaluator,
30733073
WhereClauseOwner(const_cast<AbstractFunctionDecl *>(FD), attr),
30743074
/*addedRequirements=*/{},
30753075
/*inferenceSources=*/{},
3076-
/*allowConcreteGenericParams=*/false};
3076+
/*isExtension=*/false,
3077+
/*allowInverses=*/true};
30773078

30783079
auto specializedSig = evaluateOrDefault(Ctx.evaluator, request,
30793080
GenericSignatureWithError())
@@ -5595,7 +5596,8 @@ bool resolveDifferentiableAttrDerivativeGenericSignature(
55955596
WhereClauseOwner(original, attr),
55965597
/*addedRequirements=*/{},
55975598
/*inferenceSources=*/{},
5598-
/*allowConcreteParams=*/true};
5599+
/*isExtension=*/false,
5600+
/*allowInverses=*/true};
55995601

56005602
// Compute generic signature for derivative functions.
56015603
derivativeGenSig = evaluateOrDefault(ctx.evaluator, request,

lib/Sema/TypeCheckGeneric.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@ OpaqueResultTypeRequest::evaluate(Evaluator &evaluator,
118118
WhereClauseOwner(),
119119
/*addedRequirements=*/{},
120120
/*inferenceSources=*/{},
121-
/*allowConcreteGenericParams=*/false};
121+
/*isExtension=*/false,
122+
/*allowInverses=*/true};
122123

123124
interfaceSignature = evaluateOrDefault(
124125
ctx.evaluator, request, GenericSignatureWithError())
@@ -650,7 +651,6 @@ GenericSignatureRequest::evaluate(Evaluator &evaluator,
650651
if (auto subscript = dyn_cast<SubscriptDecl>(accessor->getStorage()))
651652
return subscript->getGenericSignature();
652653

653-
bool allowConcreteGenericParams = false;
654654
auto *genericParams = GC->getGenericParams();
655655
const auto *where = GC->getTrailingWhereClause();
656656

@@ -796,8 +796,6 @@ GenericSignatureRequest::evaluate(Evaluator &evaluator,
796796
return parentSig;
797797
}
798798

799-
// Extensions allow parameters to be equated with concrete types.
800-
allowConcreteGenericParams = true;
801799
} else {
802800
llvm_unreachable("Unknown generic declaration kind");
803801
}
@@ -806,7 +804,8 @@ GenericSignatureRequest::evaluate(Evaluator &evaluator,
806804
parentSig.getPointer(),
807805
genericParams, WhereClauseOwner(GC),
808806
extraReqs, inferenceSources,
809-
allowConcreteGenericParams};
807+
/*isExtension=*/isa<ExtensionDecl>(GC),
808+
/*allowInverses=*/true};
810809
return evaluateOrDefault(ctx.evaluator, request,
811810
GenericSignatureWithError()).getPointer();
812811
}

lib/Sema/TypeChecker.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@ namespace {
504504
/// Expose TypeChecker's handling of GenericParamList to SIL parsing.
505505
GenericSignature
506506
swift::handleSILGenericParams(GenericParamList *genericParams,
507-
DeclContext *DC) {
507+
DeclContext *DC, bool allowInverses) {
508508
if (genericParams == nullptr)
509509
return nullptr;
510510

@@ -529,7 +529,9 @@ swift::handleSILGenericParams(GenericParamList *genericParams,
529529
auto request = InferredGenericSignatureRequest{
530530
/*parentSig=*/nullptr,
531531
nestedList.back(), WhereClauseOwner(),
532-
{}, {}, /*allowConcreteGenericParams=*/true};
532+
{}, {},
533+
/*isExtension=*/false,
534+
allowInverses};
533535
return evaluateOrDefault(DC->getASTContext().evaluator, request,
534536
GenericSignatureWithError()).getPointer();
535537
}

0 commit comments

Comments
 (0)