Skip to content

Commit

Permalink
Merge pull request swiftlang#5127 from slavapestov/remove-unnecessary…
Browse files Browse the repository at this point in the history
…-error-path

Remove unnecessary error path
  • Loading branch information
slavapestov authored Oct 5, 2016
2 parents b280305 + 7069fbc commit 199a909
Show file tree
Hide file tree
Showing 8 changed files with 86 additions and 170 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,14 @@ CHANGELOG
Swift 3.1
---------

* [SR-1009](https://bugs.swift.org/browse/SR-1009):

Constrained extensions allow same-type constraints between generic parameters and concrete types.

```swift
extension Array where Element == Int { }
```

* [SE-0045][]:

The `Sequence` protocol adds new members `prefix(while:)` and
Expand Down
124 changes: 51 additions & 73 deletions lib/Sema/TypeCheckDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -728,12 +728,9 @@ TypeChecker::handleSILGenericParams(GenericParamList *genericParams,

for (unsigned i = 0, e = nestedList.size(); i < e; i++) {
auto genericParams = nestedList.rbegin()[i];
bool invalid = false;
auto *genericSig = validateGenericSignature(genericParams, DC, parentSig,
/*allowConcreteGenericParams=*/true,
nullptr, invalid);
if (invalid)
return std::make_pair(nullptr, nullptr);
nullptr);

revertGenericParamList(genericParams);

Expand Down Expand Up @@ -4820,43 +4817,38 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
if (auto gp = FD->getGenericParams()) {
gp->setOuterParameters(FD->getDeclContext()->getGenericParamsOfContext());

if (TC.validateGenericFuncSignature(FD)) {
auto *env = TC.markInvalidGenericSignature(FD);
FD->setGenericEnvironment(env);
} else {
// Create a fresh archetype builder.
ArchetypeBuilder builder =
TC.createArchetypeBuilder(FD->getModuleContext());
auto *parentSig = FD->getDeclContext()->getGenericSignatureOfContext();
auto *parentEnv = FD->getDeclContext()->getGenericEnvironmentOfContext();
TC.checkGenericParamList(&builder, gp, parentSig, parentEnv, nullptr);

// Infer requirements from parameter patterns.
for (auto pattern : FD->getParameterLists()) {
builder.inferRequirements(pattern, gp);
}
TC.validateGenericFuncSignature(FD);

// Infer requirements from the result type.
if (!FD->getBodyResultTypeLoc().isNull()) {
builder.inferRequirements(FD->getBodyResultTypeLoc(), gp);
}

// Revert the types within the signature so it can be type-checked with
// archetypes below.
TC.revertGenericFuncSignature(FD);
// Create a fresh archetype builder.
ArchetypeBuilder builder =
TC.createArchetypeBuilder(FD->getModuleContext());
auto *parentSig = FD->getDeclContext()->getGenericSignatureOfContext();
auto *parentEnv = FD->getDeclContext()->getGenericEnvironmentOfContext();
TC.checkGenericParamList(&builder, gp, parentSig, parentEnv, nullptr);

// Assign archetypes.
auto *sig = FD->getGenericSignature();
auto *env = builder.getGenericEnvironment(sig->getGenericParams());
FD->setGenericEnvironment(env);
// Infer requirements from parameter patterns.
for (auto pattern : FD->getParameterLists()) {
builder.inferRequirements(pattern, gp);
}

TC.finalizeGenericParamList(gp, sig, env, FD);
// Infer requirements from the result type.
if (!FD->getBodyResultTypeLoc().isNull()) {
builder.inferRequirements(FD->getBodyResultTypeLoc(), gp);
}

// Revert the types within the signature so it can be type-checked with
// archetypes below.
TC.revertGenericFuncSignature(FD);

// Assign archetypes.
auto *sig = FD->getGenericSignature();
auto *env = builder.getGenericEnvironment(sig->getGenericParams());
FD->setGenericEnvironment(env);

TC.finalizeGenericParamList(gp, sig, env, FD);
} else if (FD->getDeclContext()->getGenericSignatureOfContext()) {
if (TC.validateGenericFuncSignature(FD)) {
auto *env = TC.markInvalidGenericSignature(FD);
FD->setGenericEnvironment(env);
} else if (!FD->hasType()) {
TC.validateGenericFuncSignature(FD);
if (!FD->hasType()) {
// Revert all of the types within the signature of the function.
TC.revertGenericFuncSignature(FD);
FD->setGenericEnvironment(
Expand Down Expand Up @@ -6523,41 +6515,34 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
// Write up generic parameters and check the generic parameter list.
gp->setOuterParameters(CD->getDeclContext()->getGenericParamsOfContext());

if (TC.validateGenericFuncSignature(CD)) {
auto *env = TC.markInvalidGenericSignature(CD);
CD->setGenericEnvironment(env);
} else {
ArchetypeBuilder builder =
TC.createArchetypeBuilder(CD->getModuleContext());
auto *parentSig = CD->getDeclContext()->getGenericSignatureOfContext();
auto *parentEnv = CD->getDeclContext()->getGenericEnvironmentOfContext();
TC.checkGenericParamList(&builder, gp, parentSig, parentEnv, nullptr);
TC.validateGenericFuncSignature(CD);

// Infer requirements from the parameters of the constructor.
builder.inferRequirements(CD->getParameterList(1), gp);
auto builder = TC.createArchetypeBuilder(CD->getModuleContext());
auto *parentSig = CD->getDeclContext()->getGenericSignatureOfContext();
auto *parentEnv = CD->getDeclContext()->getGenericEnvironmentOfContext();
TC.checkGenericParamList(&builder, gp, parentSig, parentEnv, nullptr);

// Revert the types within the signature so it can be type-checked with
// archetypes below.
TC.revertGenericFuncSignature(CD);
// Infer requirements from the parameters of the constructor.
builder.inferRequirements(CD->getParameterList(1), gp);

// Assign archetypes.
auto *sig = CD->getGenericSignature();
auto *env = builder.getGenericEnvironment(sig->getGenericParams());
CD->setGenericEnvironment(env);
// Revert the types within the signature so it can be type-checked with
// archetypes below.
TC.revertGenericFuncSignature(CD);

TC.finalizeGenericParamList(gp, sig, env, CD);
}
// Assign archetypes.
auto *sig = CD->getGenericSignature();
auto *env = builder.getGenericEnvironment(sig->getGenericParams());
CD->setGenericEnvironment(env);

TC.finalizeGenericParamList(gp, sig, env, CD);
} else if (CD->getDeclContext()->getGenericSignatureOfContext()) {
if (TC.validateGenericFuncSignature(CD)) {
auto *env = TC.markInvalidGenericSignature(CD);
CD->setGenericEnvironment(env);
} else {
// Revert all of the types within the signature of the constructor.
TC.revertGenericFuncSignature(CD);
TC.validateGenericFuncSignature(CD);

CD->setGenericEnvironment(
CD->getDeclContext()->getGenericEnvironmentOfContext());
}
// Revert all of the types within the signature of the constructor.
TC.revertGenericFuncSignature(CD);

CD->setGenericEnvironment(
CD->getDeclContext()->getGenericEnvironmentOfContext());
}

{
Expand Down Expand Up @@ -7543,21 +7528,14 @@ static Type checkExtensionGenericParams(
SWIFT_DEFER { ext->setIsBeingTypeChecked(false); };

// Validate the generic type signature.
bool invalid = false;
auto *parentSig = ext->getDeclContext()->getGenericSignatureOfContext();
auto *parentEnv = ext->getDeclContext()->getGenericEnvironmentOfContext();
auto *sig = tc.validateGenericSignature(genericParams,
ext->getDeclContext(), parentSig,
/*allowConcreteGenericParams=*/true,
inferExtendedTypeReqs, invalid);
inferExtendedTypeReqs);
ext->setGenericSignature(sig);

if (invalid) {
auto *env = tc.markInvalidGenericSignature(ext);
ext->setGenericEnvironment(env);
return nullptr;
}

// Validate the generic parameters for the last time.
tc.revertGenericParamList(genericParams);
ArchetypeBuilder builder = tc.createArchetypeBuilder(ext->getModuleContext());
Expand Down
Loading

0 comments on commit 199a909

Please sign in to comment.