Skip to content

Commit a9733cb

Browse files
committed
[GSB] Resolve dependent member types in same-type and superclass constraints.
Once we're finalizing same-type-to-concrete and superclass constraints, replace any unresolved DependentMemberTypes with their resolved counterpairs. This allows us to simplify DependentGenericTypeResolver, which only builds unresolved DependentMemberTypes now, and eliminates the penultimate use of ArchetypeResolutionKind::AlwaysPartial.
1 parent 773e144 commit a9733cb

File tree

6 files changed

+35
-23
lines changed

6 files changed

+35
-23
lines changed

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: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,7 @@ Type DependentGenericTypeResolver::resolveDependentMemberType(
4242
DeclContext *DC,
4343
SourceRange baseRange,
4444
ComponentIdentTypeRepr *ref) {
45-
#if true
46-
auto archetype =
47-
Builder.resolveArchetype(baseTy, ArchetypeResolutionKind::AlwaysPartial);
48-
assert(archetype && "Bad generic context nesting?");
49-
50-
return archetype
51-
->getNestedType(ref->getIdentifier(), Builder)
52-
->getDependentType(GenericParams, /*allowUnresolved=*/true);
53-
#else
5445
return DependentMemberType::get(baseTy, ref->getIdentifier());
55-
#endif
5646
}
5747

5848
Type DependentGenericTypeResolver::resolveSelfAssociatedType(
@@ -794,7 +784,7 @@ TypeChecker::validateGenericFuncSignature(AbstractFunctionDecl *func) {
794784

795785
// Type check the function declaration, treating all generic type
796786
// parameters as dependent, unresolved.
797-
DependentGenericTypeResolver dependentResolver(builder, allGenericParams);
787+
DependentGenericTypeResolver dependentResolver;
798788
if (checkGenericFuncSignature(*this, &builder, func, dependentResolver))
799789
invalid = true;
800790

@@ -1025,7 +1015,7 @@ TypeChecker::validateGenericSubscriptSignature(SubscriptDecl *subscript) {
10251015

10261016
// Type check the function declaration, treating all generic type
10271017
// parameters as dependent, unresolved.
1028-
DependentGenericTypeResolver dependentResolver(builder, allGenericParams);
1018+
DependentGenericTypeResolver dependentResolver;
10291019
if (checkGenericSubscriptSignature(*this, &builder, subscript,
10301020
dependentResolver))
10311021
invalid = true;
@@ -1144,7 +1134,7 @@ GenericEnvironment *TypeChecker::checkGenericEnvironment(
11441134

11451135
// Type check the generic parameters, treating all generic type
11461136
// parameters as dependent, unresolved.
1147-
DependentGenericTypeResolver dependentResolver(builder, allGenericParams);
1137+
DependentGenericTypeResolver dependentResolver;
11481138
if (recursivelyVisitGenericParams) {
11491139
visitOuterToInner(genericParams,
11501140
[&](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)