Skip to content

Commit c8bf35a

Browse files
committed
NCGenerics: precedence of inverses & reqirements
With the removal of `fromDefault` in StructuralRequirement, `applyInverses` no longer could distinguish which reqirements came from `expandDefaults` and which were explicitly written in source. Thus, for a generic parameter like `<T> where T: Copyable, T: ~Copyable`, the inverse `~Copyable` was eliminating the explicitly-written requirement, causing `T` to be noncopyable. We want to emit an error in such cases, so this swaps things around so we only ever applyInverses on a requirements list that is from expandDefaults.
1 parent a396fcc commit c8bf35a

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

lib/AST/RequirementMachine/RequirementLowering.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -926,8 +926,11 @@ StructuralRequirementsRequest::evaluate(Evaluator &evaluator,
926926
SourceLoc()});
927927

928928
desugarRequirements(result, inverses, errors);
929-
InverseRequirement::expandDefaults(ctx, needsDefaultRequirements, result);
930-
applyInverses(ctx, needsDefaultRequirements, inverses, result, errors);
929+
930+
SmallVector<StructuralRequirement, 2> defaults;
931+
InverseRequirement::expandDefaults(ctx, needsDefaultRequirements, defaults);
932+
applyInverses(ctx, needsDefaultRequirements, inverses, defaults, errors);
933+
result.append(defaults);
931934

932935
diagnoseRequirementErrors(ctx, errors,
933936
AllowConcreteTypePolicy::NestedAssocTypes);
@@ -994,11 +997,13 @@ StructuralRequirementsRequest::evaluate(Evaluator &evaluator,
994997

995998
desugarRequirements(result, inverses, errors);
996999

1000+
SmallVector<StructuralRequirement, 2> defaults;
9971001
// We do not expand defaults for invertible protocols themselves.
9981002
if (!proto->getInvertibleProtocolKind())
999-
InverseRequirement::expandDefaults(ctx, needsDefaultRequirements, result);
1003+
InverseRequirement::expandDefaults(ctx, needsDefaultRequirements, defaults);
10001004

1001-
applyInverses(ctx, needsDefaultRequirements, inverses, result, errors);
1005+
applyInverses(ctx, needsDefaultRequirements, inverses, defaults, errors);
1006+
result.append(defaults);
10021007

10031008
diagnoseRequirementErrors(ctx, errors,
10041009
AllowConcreteTypePolicy::NestedAssocTypes);

lib/AST/RequirementMachine/RequirementMachineRequests.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -667,8 +667,10 @@ AbstractGenericSignatureRequest::evaluate(
667667
paramsAsTypes.push_back(gtpt);
668668
}
669669

670-
InverseRequirement::expandDefaults(ctx, paramsAsTypes, requirements);
671-
applyInverses(ctx, paramsAsTypes, inverses, requirements, errors);
670+
SmallVector<StructuralRequirement, 2> defaults;
671+
InverseRequirement::expandDefaults(ctx, paramsAsTypes, defaults);
672+
applyInverses(ctx, paramsAsTypes, inverses, defaults, errors);
673+
requirements.append(defaults);
672674

673675
auto &rewriteCtx = ctx.getRewriteContext();
674676

@@ -882,8 +884,10 @@ InferredGenericSignatureRequest::evaluate(
882884
paramTypes.append(genericParams.begin() + numOuterParams, genericParams.end());
883885
}
884886

885-
InverseRequirement::expandDefaults(ctx, paramTypes, requirements);
886-
applyInverses(ctx, paramTypes, inverses, requirements, errors);
887+
SmallVector<StructuralRequirement, 2> defaults;
888+
InverseRequirement::expandDefaults(ctx, paramTypes, defaults);
889+
applyInverses(ctx, paramTypes, inverses, defaults, errors);
890+
requirements.append(defaults);
887891

888892
auto &rewriteCtx = ctx.getRewriteContext();
889893

0 commit comments

Comments
 (0)