Skip to content

Commit 9f9c08b

Browse files
authored
Merge pull request #9050 from DougGregor/collected-fixes
[4.0] Collected fixes
2 parents 91e231f + 72e8fae commit 9f9c08b

File tree

6 files changed

+33
-10
lines changed

6 files changed

+33
-10
lines changed

include/swift/AST/GenericSignatureBuilder.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -869,7 +869,7 @@ class GenericSignatureBuilder::RequirementSource final
869869
"RequirementSource kind/storageKind mismatch");
870870

871871
storage.type = type.getPointer();
872-
if (kind == ProtocolRequirement)
872+
if (isProtocolRequirement())
873873
getTrailingObjects<ProtocolDecl *>()[0] = protocol;
874874
if (hasTrailingWrittenRequirementLoc)
875875
getTrailingObjects<WrittenRequirementLoc>()[0] = writtenReqLoc;
@@ -979,6 +979,11 @@ class GenericSignatureBuilder::RequirementSource final
979979
llvm::function_ref<bool(PotentialArchetype *,
980980
const RequirementSource *)> visitor) const;
981981

982+
/// Whether this source is a requirement in a protocol.
983+
bool isProtocolRequirement() const {
984+
return kind == ProtocolRequirement || kind == InferredProtocolRequirement;
985+
}
986+
982987
/// Whether the requirement is inferred or derived from an inferred
983988
/// requirement.
984989
bool isInferredRequirement() const;

lib/AST/GenericSignature.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -823,8 +823,7 @@ ConformanceAccessPath GenericSignature::getConformanceAccessPath(
823823
buildPath = [&](GenericSignature *sig, const RequirementSource *source,
824824
ProtocolDecl *conformingProto, Type rootType) {
825825
// Each protocol requirement is a step along the path.
826-
if (source->kind == RequirementSource::ProtocolRequirement ||
827-
source->kind == RequirementSource::InferredProtocolRequirement) {
826+
if (source->isProtocolRequirement()) {
828827
// Follow the rest of the path to derive the conformance into which
829828
// this particular protocol requirement step would look.
830829
auto inProtocol = source->getProtocolDecl();

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,7 @@ ProtocolDecl *RequirementSource::getProtocolDecl() const {
613613
return nullptr;
614614

615615
case StorageKind::StoredType:
616-
if (kind == ProtocolRequirement)
616+
if (isProtocolRequirement())
617617
return getTrailingObjects<ProtocolDecl *>()[0];
618618
return nullptr;
619619

@@ -637,7 +637,7 @@ SourceLoc RequirementSource::getLoc() const {
637637
// for a particular requirement, rather than turning on/off location info.
638638
// Locations that fall into this category should be advisory, emitted via
639639
// notes rather than as the normal location.
640-
if (kind == ProtocolRequirement && parent &&
640+
if (isProtocolRequirement() && parent &&
641641
parent->kind != RequirementSignatureSelf)
642642
return parent->getLoc();
643643

@@ -668,8 +668,7 @@ SourceLoc RequirementSource::getLoc() const {
668668
static unsigned sourcePathLength(const RequirementSource *source) {
669669
unsigned count = 0;
670670
for (; source; source = source->parent) {
671-
if (source->kind == RequirementSource::ProtocolRequirement ||
672-
source->kind == RequirementSource::InferredProtocolRequirement)
671+
if (source->isProtocolRequirement())
673672
++count;
674673
}
675674
return count;
@@ -942,7 +941,7 @@ bool FloatingRequirementSource::isRecursive(
942941
llvm::SmallSet<std::pair<CanType, ProtocolDecl *>, 4> visitedAssocReqs;
943942
for (auto storedSource = storage.dyn_cast<const RequirementSource *>();
944943
storedSource; storedSource = storedSource->parent) {
945-
if (storedSource->kind != RequirementSource::ProtocolRequirement)
944+
if (!storedSource->isProtocolRequirement())
946945
continue;
947946

948947
if (!visitedAssocReqs.insert(

lib/Sema/TypeChecker.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -578,10 +578,14 @@ static void typeCheckFunctionsAndExternalDecls(TypeChecker &TC) {
578578
// Now that all types have been finalized, run any delayed
579579
// circularity checks.
580580
// This has been written carefully to fail safe + finitely if
581-
// for some reason a type gets re-delayed.
581+
// for some reason a type gets re-delayed in a non-assertions
582+
// build in an otherwise successful build.
583+
// Types can be redelayed in a failing build because we won't
584+
// type-check required declarations from different files.
582585
for (size_t i = 0, e = TC.DelayedCircularityChecks.size(); i != e; ++i) {
583586
TC.checkDeclCircularity(TC.DelayedCircularityChecks[i]);
584-
assert(e == TC.DelayedCircularityChecks.size() &&
587+
assert((e == TC.DelayedCircularityChecks.size() ||
588+
TC.Context.hadError()) &&
585589
"circularity checking for type was re-delayed!");
586590
}
587591
TC.DelayedCircularityChecks.clear();
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
struct External {
2+
var member: Something
3+
}
4+
5+
struct OtherExternal {}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// RUN: %target-swift-frontend -emit-silgen -verify -primary-file %s %S/Inputs/circularity_multifile_error_helper.swift
2+
3+
// SR-4594
4+
5+
struct A {
6+
var b: AnUndefinedType // expected-error {{use of undeclared type 'AnUndefinedType'}}
7+
}
8+
9+
struct B {
10+
var a : External
11+
}

0 commit comments

Comments
 (0)