@@ -77,36 +77,40 @@ TypeResolution::forStructural(DeclContext *dc, TypeResolutionOptions options,
77
77
HandlePlaceholderTypeReprFn placeholderHandler,
78
78
OpenPackElementFn packElementOpener) {
79
79
return TypeResolution (dc, {}, TypeResolutionStage::Structural, options,
80
- unboundTyOpener, placeholderHandler, packElementOpener);
80
+ unboundTyOpener, placeholderHandler, packElementOpener,
81
+ /* requirementOpener*/ nullptr );
81
82
}
82
83
83
84
TypeResolution
84
85
TypeResolution::forInterface (DeclContext *dc, TypeResolutionOptions options,
85
86
OpenUnboundGenericTypeFn unboundTyOpener,
86
87
HandlePlaceholderTypeReprFn placeholderHandler,
87
- OpenPackElementFn packElementOpener) {
88
+ OpenPackElementFn packElementOpener,
89
+ OpenRequirementFn requirementOpener) {
88
90
return forInterface (dc, dc->getGenericSignatureOfContext (), options,
89
- unboundTyOpener, placeholderHandler, packElementOpener);
91
+ unboundTyOpener, placeholderHandler, packElementOpener,
92
+ requirementOpener);
90
93
}
91
94
92
- TypeResolution
93
- TypeResolution::forInterface (DeclContext *dc, GenericSignature genericSig,
94
- TypeResolutionOptions options,
95
- OpenUnboundGenericTypeFn unboundTyOpener,
96
- HandlePlaceholderTypeReprFn placeholderHandler,
97
- OpenPackElementFn packElementOpener) {
95
+ TypeResolution TypeResolution::forInterface (
96
+ DeclContext *dc, GenericSignature genericSig, TypeResolutionOptions options,
97
+ OpenUnboundGenericTypeFn unboundTyOpener,
98
+ HandlePlaceholderTypeReprFn placeholderHandler,
99
+ OpenPackElementFn packElementOpener, OpenRequirementFn requirementOpener) {
98
100
return TypeResolution (dc, genericSig, TypeResolutionStage::Interface, options,
99
- unboundTyOpener, placeholderHandler, packElementOpener);
101
+ unboundTyOpener, placeholderHandler, packElementOpener,
102
+ requirementOpener);
100
103
}
101
104
102
105
TypeResolution TypeResolution::withOptions (TypeResolutionOptions opts) const {
103
106
return TypeResolution (dc, genericSig, stage, opts, unboundTyOpener,
104
- placeholderHandler, packElementOpener);
107
+ placeholderHandler, packElementOpener,
108
+ requirementOpener);
105
109
}
106
110
107
111
TypeResolution TypeResolution::withoutPackElementOpener () const {
108
112
return TypeResolution (dc, genericSig, stage, options, unboundTyOpener,
109
- placeholderHandler, {});
113
+ placeholderHandler, {}, requirementOpener );
110
114
}
111
115
112
116
ASTContext &TypeResolution::getASTContext () const {
@@ -1185,6 +1189,7 @@ Type TypeResolution::applyUnboundGenericArguments(
1185
1189
// or unbound generics, let's skip the check here, and let the solver
1186
1190
// do it when missing types are deduced.
1187
1191
bool skipRequirementsCheck = false ;
1192
+ bool hasTypeVariables = false ;
1188
1193
if (options.contains (TypeResolutionFlags::SILType)) {
1189
1194
if (auto nominal = dyn_cast<NominalTypeDecl>(decl)) {
1190
1195
if (nominal->isOptionalDecl ()) {
@@ -1215,7 +1220,7 @@ Type TypeResolution::applyUnboundGenericArguments(
1215
1220
subs = parentTy->getContextSubstitutions (decl->getDeclContext ());
1216
1221
}
1217
1222
1218
- skipRequirementsCheck |= parentTy->hasTypeVariable ();
1223
+ hasTypeVariables |= parentTy->hasTypeVariable ();
1219
1224
1220
1225
// Fill in substitutions for outer generic parameters if we have a local
1221
1226
// type in generic context. This isn't actually supported all the way,
@@ -1243,56 +1248,59 @@ Type TypeResolution::applyUnboundGenericArguments(
1243
1248
// Enter the substitution.
1244
1249
subs[paramTy] = substTy;
1245
1250
1246
- skipRequirementsCheck |=
1247
- substTy-> hasTypeVariable () || substTy->hasUnboundGenericType ();
1251
+ hasTypeVariables |= substTy-> hasTypeVariable ();
1252
+ skipRequirementsCheck |= substTy->hasUnboundGenericType ();
1248
1253
}
1249
1254
1255
+ const auto substitutions = [&](SubstitutableType *type) -> Type {
1256
+ auto result = QueryTypeSubstitutionMap{subs}(type);
1257
+ if (result->hasTypeParameter ()) {
1258
+ if (const auto contextSig = getGenericSignature ()) {
1259
+ auto *genericEnv = contextSig.getGenericEnvironment ();
1260
+ // FIXME: This should just use mapTypeIntoContext(), but we can't yet
1261
+ // because we sometimes have type parameters here that are invalid for
1262
+ // our generic signature. This can happen if the type parameter was
1263
+ // found via unqualified lookup, but the current context's
1264
+ // generic signature failed to build because of circularity or
1265
+ // completion failure.
1266
+ return result.subst (QueryInterfaceTypeSubstitutions{genericEnv},
1267
+ LookUpConformanceInModule (),
1268
+ SubstFlags::PreservePackExpansionLevel);
1269
+ }
1270
+ }
1271
+ return result;
1272
+ };
1273
+
1250
1274
// Check the generic arguments against the requirements of the declaration's
1251
1275
// generic signature.
1252
1276
if (!skipRequirementsCheck && getStage () == TypeResolutionStage::Interface) {
1253
- // Check the generic arguments against the requirements of the declaration's
1254
- // generic signature.
1277
+ if (hasTypeVariables) {
1278
+ ASSERT (requirementOpener && " Must have requirement opener for type vars" );
1279
+ requirementOpener (decl, substitutions);
1280
+ } else {
1281
+ SourceLoc noteLoc = decl->getLoc ();
1282
+ if (noteLoc.isInvalid ())
1283
+ noteLoc = loc;
1255
1284
1256
- SourceLoc noteLoc = decl->getLoc ();
1257
- if (noteLoc.isInvalid ())
1258
- noteLoc = loc;
1285
+ auto genericSig = decl->getGenericSignature ();
1259
1286
1260
- auto genericSig = decl->getGenericSignature ();
1261
- const auto substitutions = [&](SubstitutableType *type) -> Type {
1262
- auto result = QueryTypeSubstitutionMap{subs}(type);
1263
- if (result->hasTypeParameter ()) {
1264
- if (const auto contextSig = getGenericSignature ()) {
1265
- auto *genericEnv = contextSig.getGenericEnvironment ();
1266
- // FIXME: This should just use mapTypeIntoContext(), but we can't yet
1267
- // because we sometimes have type parameters here that are invalid for
1268
- // our generic signature. This can happen if the type parameter was
1269
- // found via unqualified lookup, but the current context's
1270
- // generic signature failed to build because of circularity or
1271
- // completion failure.
1272
- return result.subst (QueryInterfaceTypeSubstitutions{genericEnv},
1273
- LookUpConformanceInModule (),
1274
- SubstFlags::PreservePackExpansionLevel);
1287
+ const auto result = TypeChecker::checkGenericArgumentsForDiagnostics (
1288
+ genericSig, substitutions);
1289
+ switch (result.getKind ()) {
1290
+ case CheckRequirementsResult::RequirementFailure:
1291
+ if (loc.isValid ()) {
1292
+ TypeChecker::diagnoseRequirementFailure (
1293
+ result.getRequirementFailureInfo (), loc, noteLoc,
1294
+ UnboundGenericType::get (decl, parentTy, ctx),
1295
+ genericSig.getGenericParams (), substitutions);
1275
1296
}
1276
- }
1277
- return result;
1278
- };
1279
1297
1280
- const auto result = TypeChecker::checkGenericArgumentsForDiagnostics (
1281
- genericSig, substitutions);
1282
- switch (result.getKind ()) {
1283
- case CheckRequirementsResult::RequirementFailure:
1284
- if (loc.isValid ()) {
1285
- TypeChecker::diagnoseRequirementFailure (
1286
- result.getRequirementFailureInfo (), loc, noteLoc,
1287
- UnboundGenericType::get (decl, parentTy, ctx),
1288
- genericSig.getGenericParams (), substitutions);
1298
+ LLVM_FALLTHROUGH;
1299
+ case CheckRequirementsResult::SubstitutionFailure:
1300
+ return ErrorType::get (ctx);
1301
+ case CheckRequirementsResult::Success:
1302
+ break ;
1289
1303
}
1290
-
1291
- LLVM_FALLTHROUGH;
1292
- case CheckRequirementsResult::SubstitutionFailure:
1293
- return ErrorType::get (ctx);
1294
- case CheckRequirementsResult::Success:
1295
- break ;
1296
1304
}
1297
1305
}
1298
1306
@@ -2564,22 +2572,22 @@ Type TypeResolution::resolveContextualType(
2564
2572
TypeRepr *TyR, DeclContext *dc, TypeResolutionOptions opts,
2565
2573
OpenUnboundGenericTypeFn unboundTyOpener,
2566
2574
HandlePlaceholderTypeReprFn placeholderHandler,
2567
- OpenPackElementFn packElementOpener,
2575
+ OpenPackElementFn packElementOpener, OpenRequirementFn requirementOpener,
2568
2576
SILTypeResolutionContext *silContext) {
2569
- return resolveContextualType (TyR, dc, dc-> getGenericSignatureOfContext (),
2570
- opts, unboundTyOpener, placeholderHandler ,
2571
- packElementOpener, silContext);
2577
+ return resolveContextualType (
2578
+ TyR, dc, dc-> getGenericSignatureOfContext (), opts, unboundTyOpener,
2579
+ placeholderHandler, packElementOpener, requirementOpener , silContext);
2572
2580
}
2573
2581
2574
2582
Type TypeResolution::resolveContextualType (
2575
2583
TypeRepr *TyR, DeclContext *dc, GenericSignature genericSig,
2576
2584
TypeResolutionOptions opts, OpenUnboundGenericTypeFn unboundTyOpener,
2577
2585
HandlePlaceholderTypeReprFn placeholderHandler,
2578
- OpenPackElementFn packElementOpener,
2586
+ OpenPackElementFn packElementOpener, OpenRequirementFn requirementOpener,
2579
2587
SILTypeResolutionContext *silContext) {
2580
2588
const auto resolution = TypeResolution::forInterface (
2581
2589
dc, genericSig, opts, unboundTyOpener, placeholderHandler,
2582
- packElementOpener);
2590
+ packElementOpener, requirementOpener );
2583
2591
const auto ty = resolution.resolveType (TyR, silContext);
2584
2592
2585
2593
return GenericEnvironment::mapTypeIntoContext (
@@ -4384,11 +4392,10 @@ NeverNullType TypeResolver::resolveSILBoxType(SILBoxTypeRepr *repr,
4384
4392
auto *genericParams = repr->getGenericParams ();
4385
4393
4386
4394
if (genericParams) {
4387
- fieldResolution =
4388
- TypeResolution::forInterface (getDeclContext (), genericSig, options,
4389
- resolution.getUnboundTypeOpener (),
4390
- resolution.getPlaceholderHandler (),
4391
- resolution.getPackElementOpener ());
4395
+ fieldResolution = TypeResolution::forInterface (
4396
+ getDeclContext (), genericSig, options,
4397
+ resolution.getUnboundTypeOpener (), resolution.getPlaceholderHandler (),
4398
+ resolution.getPackElementOpener (), resolution.getRequirementOpener ());
4392
4399
}
4393
4400
4394
4401
SILInnerGenericContextRAII scope (silContext, genericParams);
@@ -4593,9 +4600,8 @@ NeverNullType TypeResolver::resolveSILFunctionType(FunctionTypeRepr *repr,
4593
4600
if (componentTypeSig) {
4594
4601
functionResolution = TypeResolution::forInterface (
4595
4602
getDeclContext (), componentTypeSig, options,
4596
- resolution.getUnboundTypeOpener (),
4597
- resolution.getPlaceholderHandler (),
4598
- resolution.getPackElementOpener ());
4603
+ resolution.getUnboundTypeOpener (), resolution.getPlaceholderHandler (),
4604
+ resolution.getPackElementOpener (), resolution.getRequirementOpener ());
4599
4605
}
4600
4606
4601
4607
SILInnerGenericContextRAII innerGenericContext (silContext,
@@ -4651,11 +4657,10 @@ NeverNullType TypeResolver::resolveSILFunctionType(FunctionTypeRepr *repr,
4651
4657
SubstitutionMap patternSubs;
4652
4658
if (!repr->getPatternSubstitutions ().empty ()) {
4653
4659
if (genericSig) {
4654
- auto resolveSILParameters =
4655
- TypeResolution::forInterface (getDeclContext (), genericSig, options,
4656
- resolution.getUnboundTypeOpener (),
4657
- resolution.getPlaceholderHandler (),
4658
- resolution.getPackElementOpener ());
4660
+ auto resolveSILParameters = TypeResolution::forInterface (
4661
+ getDeclContext (), genericSig, options,
4662
+ resolution.getUnboundTypeOpener (), resolution.getPlaceholderHandler (),
4663
+ resolution.getPackElementOpener (), resolution.getRequirementOpener ());
4659
4664
patternSubs = resolveSubstitutions (repr->getPatternGenericSignature (),
4660
4665
repr->getPatternSubstitutions (),
4661
4666
TypeResolver{resolveSILParameters,
0 commit comments