Skip to content

Commit 6707214

Browse files
committed
[Type checker] When we sugar an extension type, infer requirements.
The optimization that avoided forming new generic signatures for extensions of nominal types was kicking in too eagerly, preventing us from inferring requirements from the typealias.
1 parent 240e52e commit 6707214

File tree

3 files changed

+18
-8
lines changed

3 files changed

+18
-8
lines changed

lib/Sema/TypeCheckDecl.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8279,7 +8279,8 @@ bool swift::isPassThroughTypealias(TypeAliasDecl *typealias) {
82798279
/// extension's list of generic parameters.
82808280
static Type formExtensionInterfaceType(TypeChecker &tc, ExtensionDecl *ext,
82818281
Type type,
8282-
GenericParamList *genericParams) {
8282+
GenericParamList *genericParams,
8283+
bool &mustInferRequirements) {
82838284
// Find the nominal type declaration and its parent type.
82848285
Type parentType;
82858286
GenericTypeDecl *genericDecl;
@@ -8301,7 +8302,8 @@ static Type formExtensionInterfaceType(TypeChecker &tc, ExtensionDecl *ext,
83018302
? genericParams->getOuterParameters()
83028303
: genericParams;
83038304
parentType =
8304-
formExtensionInterfaceType(tc, ext, parentType, parentGenericParams);
8305+
formExtensionInterfaceType(tc, ext, parentType, parentGenericParams,
8306+
mustInferRequirements);
83058307
}
83068308

83078309
// Find the nominal type.
@@ -8345,6 +8347,8 @@ static Type formExtensionInterfaceType(TypeChecker &tc, ExtensionDecl *ext,
83458347

83468348
resultType = BoundNameAliasType::get(typealias, parentType,
83478349
subMap, resultType);
8350+
8351+
mustInferRequirements = true;
83488352
} else {
83498353
resultType = typealias->getDeclaredInterfaceType();
83508354
}
@@ -8372,8 +8376,10 @@ checkExtensionGenericParams(TypeChecker &tc, ExtensionDecl *ext, Type type,
83728376
assert(!ext->getGenericEnvironment());
83738377

83748378
// Form the interface type of the extension.
8379+
bool mustInferRequirements = false;
83758380
Type extInterfaceType =
8376-
formExtensionInterfaceType(tc, ext, type, genericParams);
8381+
formExtensionInterfaceType(tc, ext, type, genericParams,
8382+
mustInferRequirements);
83778383

83788384
// Prepare all of the generic parameter lists for generic signature
83798385
// validation.
@@ -8395,7 +8401,8 @@ checkExtensionGenericParams(TypeChecker &tc, ExtensionDecl *ext, Type type,
83958401
auto *env = tc.checkGenericEnvironment(genericParams,
83968402
ext->getDeclContext(), nullptr,
83978403
/*allowConcreteGenericParams=*/true,
8398-
ext, inferExtendedTypeReqs);
8404+
ext, inferExtendedTypeReqs,
8405+
mustInferRequirements);
83998406

84008407
// Validate the generic parameters for the last time, to splat down
84018408
// actual archetypes.

lib/Sema/TypeCheckGeneric.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1147,13 +1147,14 @@ GenericEnvironment *TypeChecker::checkGenericEnvironment(
11471147
bool allowConcreteGenericParams,
11481148
ExtensionDecl *ext,
11491149
llvm::function_ref<void(GenericSignatureBuilder &)>
1150-
inferRequirements) {
1150+
inferRequirements,
1151+
bool mustInferRequirements) {
11511152
assert(genericParams && "Missing generic parameters?");
11521153
bool recursivelyVisitGenericParams =
11531154
genericParams->getOuterParameters() && !parentSig;
11541155

11551156
GenericSignature *sig;
1156-
if (!ext || ext->getTrailingWhereClause() ||
1157+
if (!ext || mustInferRequirements || ext->getTrailingWhereClause() ||
11571158
getExtendedTypeGenericDepth(ext) != genericParams->getDepth()) {
11581159
// Collect the generic parameters.
11591160
SmallVector<GenericTypeParamType *, 4> allGenericParams;

lib/Sema/TypeChecker.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1419,7 +1419,8 @@ class TypeChecker final : public LazyResolver {
14191419
bool allowConcreteGenericParams,
14201420
ExtensionDecl *ext,
14211421
llvm::function_ref<void(GenericSignatureBuilder &)>
1422-
inferRequirements);
1422+
inferRequirements,
1423+
bool mustInferRequirements);
14231424

14241425
/// Construct a new generic environment for the given declaration context.
14251426
///
@@ -1439,7 +1440,8 @@ class TypeChecker final : public LazyResolver {
14391440
ExtensionDecl *ext) {
14401441
return checkGenericEnvironment(genericParams, dc, outerSignature,
14411442
allowConcreteGenericParams, ext,
1442-
[&](GenericSignatureBuilder &) { });
1443+
[&](GenericSignatureBuilder &) { },
1444+
/*mustInferRequirements=*/false);
14431445
}
14441446

14451447
/// Validate the signature of a generic type.

0 commit comments

Comments
 (0)