@@ -1949,7 +1949,8 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
1949
1949
1950
1950
// Strip the "is function input" bits unless this is a type that knows about
1951
1951
// them.
1952
- if (!isa<SpecifierTypeRepr>(repr) && !isa<TupleTypeRepr>(repr) &&
1952
+ if (options.is (TypeResolverContext::FunctionInput) &&
1953
+ !isa<SpecifierTypeRepr>(repr) && !isa<TupleTypeRepr>(repr) &&
1953
1954
!isa<AttributedTypeRepr>(repr) && !isa<FunctionTypeRepr>(repr) &&
1954
1955
!isa<IdentTypeRepr>(repr) &&
1955
1956
!isa<ImplicitlyUnwrappedOptionalTypeRepr>(repr)) {
@@ -2067,7 +2068,7 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
2067
2068
}
2068
2069
2069
2070
auto *existential = cast<ExistentialTypeRepr>(repr);
2070
- return resolveType (existential-> getConstraint () , options);
2071
+ return resolveExistentialType (existential, options);
2071
2072
}
2072
2073
2073
2074
case TypeReprKind::NamedOpaqueReturn:
@@ -3381,6 +3382,14 @@ TypeResolver::resolveIdentifierType(IdentTypeRepr *IdType,
3381
3382
return ErrorType::get (getASTContext ());
3382
3383
}
3383
3384
3385
+ bool isConstraintType = (result->is <ProtocolType>() ||
3386
+ result->is <ProtocolCompositionType>());
3387
+ if (isConstraintType &&
3388
+ getASTContext ().LangOpts .EnableExplicitExistentialTypes &&
3389
+ options.isConstraintImplicitExistential ()) {
3390
+ return ExistentialType::get (result);
3391
+ }
3392
+
3384
3393
// Hack to apply context-specific @escaping to a typealias with an underlying
3385
3394
// function type.
3386
3395
if (result->is <FunctionType>())
@@ -3560,6 +3569,9 @@ NeverNullType TypeResolver::resolveImplicitlyUnwrappedOptionalType(
3560
3569
case TypeResolverContext::TypeAliasDecl:
3561
3570
case TypeResolverContext::GenericTypeAliasDecl:
3562
3571
case TypeResolverContext::GenericRequirement:
3572
+ case TypeResolverContext::SameTypeRequirement:
3573
+ case TypeResolverContext::ProtocolMetatypeBase:
3574
+ case TypeResolverContext::MetatypeBase:
3563
3575
case TypeResolverContext::ImmediateOptionalTypeArgument:
3564
3576
case TypeResolverContext::InExpression:
3565
3577
case TypeResolverContext::EditorPlaceholderExpr:
@@ -3702,7 +3714,8 @@ TypeResolver::resolveCompositionType(CompositionTypeRepr *repr,
3702
3714
};
3703
3715
3704
3716
for (auto tyR : repr->getTypes ()) {
3705
- auto ty = resolveType (tyR, options.withoutContext ());
3717
+ auto ty = resolveType (tyR,
3718
+ options.withContext (TypeResolverContext::GenericRequirement));
3706
3719
if (ty->hasError ()) return ty;
3707
3720
3708
3721
auto nominalDecl = ty->getAnyNominal ();
@@ -3739,19 +3752,27 @@ TypeResolver::resolveCompositionType(CompositionTypeRepr *repr,
3739
3752
3740
3753
// In user-written types, AnyObject constraints always refer to the
3741
3754
// AnyObject type in the standard library.
3742
- return ProtocolCompositionType::get (getASTContext (), Members,
3743
- /* HasExplicitAnyObject=*/ false );
3755
+ auto composition =
3756
+ ProtocolCompositionType::get (getASTContext (), Members,
3757
+ /* HasExplicitAnyObject=*/ false );
3758
+ if (getASTContext ().LangOpts .EnableExplicitExistentialTypes &&
3759
+ options.isConstraintImplicitExistential ()) {
3760
+ composition = ExistentialType::get (composition);
3761
+ }
3762
+ return composition;
3744
3763
}
3745
3764
3746
3765
NeverNullType
3747
3766
TypeResolver::resolveExistentialType (ExistentialTypeRepr *repr,
3748
3767
TypeResolutionOptions options) {
3749
- auto constraintType = resolveType (repr->getConstraint (), options);
3768
+ auto constraintType = resolveType (repr->getConstraint (),
3769
+ options.withContext (TypeResolverContext::GenericRequirement));
3770
+ if (constraintType->is <ExistentialMetatypeType>())
3771
+ return constraintType;
3750
3772
3751
3773
auto anyStart = repr->getAnyLoc ();
3752
3774
auto anyEnd = Lexer::getLocForEndOfToken (getASTContext ().SourceMgr , anyStart);
3753
- if (!constraintType->isExistentialType () &&
3754
- !constraintType->is <ExistentialMetatypeType>()) {
3775
+ if (!constraintType->isExistentialType ()) {
3755
3776
diagnose (repr->getLoc (), diag::any_not_existential,
3756
3777
constraintType->isTypeParameter (),
3757
3778
constraintType)
@@ -3772,7 +3793,8 @@ TypeResolver::resolveExistentialType(ExistentialTypeRepr *repr,
3772
3793
NeverNullType TypeResolver::resolveMetatypeType (MetatypeTypeRepr *repr,
3773
3794
TypeResolutionOptions options) {
3774
3795
// The instance type of a metatype is always abstract, not SIL-lowered.
3775
- auto ty = resolveType (repr->getBase (), options.withoutContext ());
3796
+ auto ty = resolveType (repr->getBase (),
3797
+ options.withContext (TypeResolverContext::MetatypeBase));
3776
3798
if (ty->hasError ()) {
3777
3799
return ErrorType::get (getASTContext ());
3778
3800
}
@@ -3793,7 +3815,8 @@ NeverNullType TypeResolver::resolveMetatypeType(MetatypeTypeRepr *repr,
3793
3815
NeverNullType
3794
3816
TypeResolver::buildMetatypeType (MetatypeTypeRepr *repr, Type instanceType,
3795
3817
Optional<MetatypeRepresentation> storedRepr) {
3796
- if (instanceType->isAnyExistentialType ()) {
3818
+ if (instanceType->isAnyExistentialType () &&
3819
+ !instanceType->is <ExistentialType>()) {
3797
3820
// TODO: diagnose invalid representations?
3798
3821
return ExistentialMetatypeType::get (instanceType, storedRepr);
3799
3822
} else {
@@ -3804,7 +3827,8 @@ TypeResolver::buildMetatypeType(MetatypeTypeRepr *repr, Type instanceType,
3804
3827
NeverNullType TypeResolver::resolveProtocolType (ProtocolTypeRepr *repr,
3805
3828
TypeResolutionOptions options) {
3806
3829
// The instance type of a metatype is always abstract, not SIL-lowered.
3807
- auto ty = resolveType (repr->getBase (), options.withoutContext ());
3830
+ auto ty = resolveType (repr->getBase (),
3831
+ options.withContext (TypeResolverContext::ProtocolMetatypeBase));
3808
3832
if (ty->hasError ()) {
3809
3833
return ErrorType::get (getASTContext ());
3810
3834
}
0 commit comments