Skip to content

Commit 5447d34

Browse files
authored
Merge pull request #9981 from DougGregor/gsb-never-always-partial
[GSB] *Almost* eliminate the "AlwaysPartial" archetype resolution kind
2 parents a630671 + a9733cb commit 5447d34

File tree

7 files changed

+44
-40
lines changed

7 files changed

+44
-40
lines changed

lib/AST/GenericSignature.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -869,11 +869,10 @@ ConformanceAccessPath GenericSignature::getConformanceAccessPath(
869869
Type storedType = eraseAssociatedTypes(source->getStoredType());
870870

871871
// Dig out the potential archetype for this stored type.
872-
// FIXME: CompleteWellFormed here?
873872
auto pa =
874873
reqSigBuilder.resolveArchetype(
875874
storedType,
876-
ArchetypeResolutionKind::AlwaysPartial);
875+
ArchetypeResolutionKind::CompleteWellFormed);
877876
auto equivClass = pa->getOrCreateEquivalenceClass();
878877

879878
// Find the conformance of this potential archetype to the protocol in

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4759,6 +4759,27 @@ void GenericSignatureBuilder::checkSameTypeConstraints(
47594759
}
47604760
}
47614761

4762+
/// Resolve any unresolved dependent member types using the given builder.
4763+
static Type resolveDependentMemberTypes(GenericSignatureBuilder &builder,
4764+
Type type) {
4765+
if (!type->hasTypeParameter()) return type;
4766+
4767+
return type.transformRec([&builder](TypeBase *type) -> Optional<Type> {
4768+
if (auto depTy = dyn_cast<DependentMemberType>(type)) {
4769+
if (depTy->getAssocType()) return None;
4770+
4771+
auto pa = builder.resolveArchetype(
4772+
type, ArchetypeResolutionKind::CompleteWellFormed);
4773+
if (!pa)
4774+
return ErrorType::get(depTy);
4775+
4776+
return pa->getDependentType({ }, /*allowUnresolved=*/false);
4777+
}
4778+
4779+
return None;
4780+
});
4781+
}
4782+
47624783
void GenericSignatureBuilder::checkConcreteTypeConstraints(
47634784
ArrayRef<GenericTypeParamType *> genericParams,
47644785
PotentialArchetype *representative) {
@@ -4783,6 +4804,10 @@ void GenericSignatureBuilder::checkConcreteTypeConstraints(
47834804
None,
47844805
diag::redundant_same_type_to_concrete,
47854806
diag::same_type_redundancy_here);
4807+
4808+
// Resolve any this-far-unresolved dependent types.
4809+
equivClass->concreteType =
4810+
resolveDependentMemberTypes(*this, equivClass->concreteType);
47864811
}
47874812

47884813
void GenericSignatureBuilder::checkSuperclassConstraints(
@@ -4821,6 +4846,10 @@ void GenericSignatureBuilder::checkSuperclassConstraints(
48214846
diag::redundant_superclass_constraint,
48224847
diag::superclass_redundancy_here);
48234848

4849+
// Resolve any this-far-unresolved dependent types.
4850+
equivClass->superclass =
4851+
resolveDependentMemberTypes(*this, equivClass->superclass);
4852+
48244853
// If we have a concrete type, check it.
48254854
// FIXME: Substitute into the concrete type.
48264855
if (equivClass->concreteType) {

lib/Sema/GenericTypeResolver.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,14 +100,7 @@ class GenericTypeResolver {
100100
/// This generic type resolver leaves generic type parameter types alone
101101
/// and only trivially resolves dependent member types.
102102
class DependentGenericTypeResolver : public GenericTypeResolver {
103-
GenericSignatureBuilder &Builder;
104-
ArrayRef<GenericTypeParamType *> GenericParams;
105-
106103
public:
107-
DependentGenericTypeResolver(GenericSignatureBuilder &builder,
108-
ArrayRef<GenericTypeParamType *> genericParams)
109-
: Builder(builder), GenericParams(genericParams) { }
110-
111104
virtual Type resolveGenericTypeParamType(GenericTypeParamType *gp);
112105

113106
virtual Type resolveDependentMemberType(Type baseTy,

lib/Sema/TypeCheckGeneric.cpp

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -42,24 +42,12 @@ Type DependentGenericTypeResolver::resolveDependentMemberType(
4242
DeclContext *DC,
4343
SourceRange baseRange,
4444
ComponentIdentTypeRepr *ref) {
45-
auto archetype =
46-
Builder.resolveArchetype(baseTy, ArchetypeResolutionKind::AlwaysPartial);
47-
assert(archetype && "Bad generic context nesting?");
48-
49-
return archetype
50-
->getNestedType(ref->getIdentifier(), Builder)
51-
->getDependentType(GenericParams, /*allowUnresolved=*/true);
45+
return DependentMemberType::get(baseTy, ref->getIdentifier());
5246
}
5347

5448
Type DependentGenericTypeResolver::resolveSelfAssociatedType(
5549
Type selfTy, AssociatedTypeDecl *assocType) {
56-
auto archetype =
57-
Builder.resolveArchetype(selfTy, ArchetypeResolutionKind::AlwaysPartial);
58-
assert(archetype && "Bad generic context nesting?");
59-
60-
return archetype
61-
->getNestedType(assocType, Builder)
62-
->getDependentType(GenericParams, /*allowUnresolved=*/true);
50+
return DependentMemberType::get(selfTy, assocType);
6351
}
6452

6553
Type DependentGenericTypeResolver::resolveTypeOfContext(DeclContext *dc) {
@@ -74,14 +62,8 @@ bool DependentGenericTypeResolver::areSameType(Type type1, Type type2) {
7462
if (!type1->hasTypeParameter() && !type2->hasTypeParameter())
7563
return type1->isEqual(type2);
7664

77-
auto pa1 =
78-
Builder.resolveArchetype(type1, ArchetypeResolutionKind::AlwaysPartial);
79-
auto pa2 =
80-
Builder.resolveArchetype(type2, ArchetypeResolutionKind::AlwaysPartial);
81-
if (pa1 && pa2)
82-
return pa1->isInSameEquivalenceClassAs(pa2);
83-
84-
return type1->isEqual(type2);
65+
// Conservative answer: they could be the same.
66+
return true;
8567
}
8668

8769
void DependentGenericTypeResolver::recordParamType(ParamDecl *decl, Type type) {
@@ -281,11 +263,12 @@ bool CompleteGenericTypeResolver::areSameType(Type type1, Type type2) {
281263
if (!type1->hasTypeParameter() && !type2->hasTypeParameter())
282264
return type1->isEqual(type2);
283265

284-
// FIXME: Want CompleteWellFormed here?
285266
auto pa1 =
286-
Builder.resolveArchetype(type1, ArchetypeResolutionKind::AlwaysPartial);
267+
Builder.resolveArchetype(type1,
268+
ArchetypeResolutionKind::CompleteWellFormed);
287269
auto pa2 =
288-
Builder.resolveArchetype(type2, ArchetypeResolutionKind::AlwaysPartial);
270+
Builder.resolveArchetype(type2,
271+
ArchetypeResolutionKind::CompleteWellFormed);
289272
if (pa1 && pa2)
290273
return pa1->isInSameEquivalenceClassAs(pa2);
291274

@@ -801,7 +784,7 @@ TypeChecker::validateGenericFuncSignature(AbstractFunctionDecl *func) {
801784

802785
// Type check the function declaration, treating all generic type
803786
// parameters as dependent, unresolved.
804-
DependentGenericTypeResolver dependentResolver(builder, allGenericParams);
787+
DependentGenericTypeResolver dependentResolver;
805788
if (checkGenericFuncSignature(*this, &builder, func, dependentResolver))
806789
invalid = true;
807790

@@ -1032,7 +1015,7 @@ TypeChecker::validateGenericSubscriptSignature(SubscriptDecl *subscript) {
10321015

10331016
// Type check the function declaration, treating all generic type
10341017
// parameters as dependent, unresolved.
1035-
DependentGenericTypeResolver dependentResolver(builder, allGenericParams);
1018+
DependentGenericTypeResolver dependentResolver;
10361019
if (checkGenericSubscriptSignature(*this, &builder, subscript,
10371020
dependentResolver))
10381021
invalid = true;
@@ -1151,7 +1134,7 @@ GenericEnvironment *TypeChecker::checkGenericEnvironment(
11511134

11521135
// Type check the generic parameters, treating all generic type
11531136
// parameters as dependent, unresolved.
1154-
DependentGenericTypeResolver dependentResolver(builder, allGenericParams);
1137+
DependentGenericTypeResolver dependentResolver;
11551138
if (recursivelyVisitGenericParams) {
11561139
visitOuterToInner(genericParams,
11571140
[&](GenericParamList *gpList) {

test/Generics/associated_type_typo.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ protocol P2 {
1414
protocol P3 { }
1515
protocol P4 { }
1616

17-
// expected-error@+1{{'T' does not have a member type named 'assoc'; did you mean 'Assoc'?}}{{30-35=Assoc}}
17+
// expected-error@+1{{'assoc' is not a member type of 'T'}}
1818
func typoAssoc1<T : P1>(x: T.assoc, _: T) { }
1919

2020
// expected-error@+2{{'T' does not have a member type named 'assoc'; did you mean 'Assoc'?}}{{53-58=Assoc}}

validation-test/compiler_crashers_2_fixed/0084-rdar31093854.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: not %target-swift-frontend -swift-version 4 %s -typecheck -o /dev/null
1+
// RUN: %target-swift-frontend -swift-version 4 %s -typecheck -o /dev/null
22

33
// This should actually type check successfully.
44

validation-test/compiler_crashers/28760-dist-0-nested-type-should-have-matched-associated-type.swift renamed to validation-test/compiler_crashers_fixed/28760-dist-0-nested-type-should-have-matched-associated-type.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
77

88
// REQUIRES: asserts
9-
// RUN: not --crash %target-swift-frontend %s -emit-ir
9+
// RUN: not %target-swift-frontend %s -emit-ir
1010
protocol P{typealias e:P{}class a{{}func a:Self.a.e

0 commit comments

Comments
 (0)