Skip to content

Commit df49e11

Browse files
committed
RequirementMachine: Skip 'verify' check if completion failed
We obviously don't have a valid generic signature in this case.
1 parent 2ee5aee commit df49e11

File tree

2 files changed

+14
-7
lines changed

2 files changed

+14
-7
lines changed

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8276,6 +8276,7 @@ AbstractGenericSignatureRequest::evaluate(
82768276
return rqmResult;
82778277

82788278
if (!rqmResult.getInt().contains(GenericSignatureErrorFlags::HasConflict) &&
8279+
!rqmResult.getInt().contains(GenericSignatureErrorFlags::CompletionFailed) &&
82798280
!rqmResult.getPointer()->isEqual(gsbResult.getPointer())) {
82808281
PrintOptions opts;
82818282
opts.ProtocolQualifiedDependentMemberTypes = true;
@@ -8489,6 +8490,7 @@ InferredGenericSignatureRequest::evaluate(
84898490
return rqmResult;
84908491

84918492
if (!rqmResult.getInt().contains(GenericSignatureErrorFlags::HasConflict) &&
8493+
!rqmResult.getInt().contains(GenericSignatureErrorFlags::CompletionFailed) &&
84928494
!rqmResult.getPointer()->isEqual(gsbResult.getPointer())) {
84938495
PrintOptions opts;
84948496
opts.ProtocolQualifiedDependentMemberTypes = true;
@@ -8692,6 +8694,7 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
86928694
auto gsbResult = buildViaGSB();
86938695

86948696
if (!rqmResult.getErrors().contains(GenericSignatureErrorFlags::HasConflict) &&
8697+
!rqmResult.getErrors().contains(GenericSignatureErrorFlags::CompletionFailed) &&
86958698
!compare(rqmResult.getRequirements(),
86968699
gsbResult.getRequirements())) {
86978700
PrintOptions opts;

test/decl/protocol/req/recursion.swift

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1-
// RUN: %target-typecheck-verify-swift
1+
// RUN: %target-typecheck-verify-swift -requirement-machine-inferred-signatures=verify
22

33
protocol SomeProtocol {
44
associatedtype T
55
}
66

77
extension SomeProtocol where T == Optional<T> { } // expected-error{{same-type constraint 'Self.T' == 'Optional<Self.T>' is recursive}}
8+
// expected-error@-1 {{cannot build rewrite system for generic signature; concrete nesting limit exceeded}}
9+
// expected-note@-2 {{failed rewrite rule is τ_0_0.[SomeProtocol:T].[concrete: Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<Optional<τ_0_0.[SomeProtocol:T]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] => τ_0_0.[SomeProtocol:T]}}
810

911
// rdar://problem/19840527
1012

1113
class X<T> where T == X { // expected-error{{same-type constraint 'T' == 'X<T>' is recursive}}
12-
// expected-error@-1{{same-type requirement makes generic parameter 'T' non-generic}}
13-
// expected-error@-2 3{{generic class 'X' has self-referential generic requirements}}
14+
// expected-error@-1 {{cannot build rewrite system for generic signature; concrete nesting limit exceeded}}
15+
// expected-note@-2 {{failed rewrite rule is τ_0_0.[concrete: X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<τ_0_0>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] => τ_0_0}}
16+
// expected-error@-3{{same-type requirement makes generic parameter 'T' non-generic}}
17+
// expected-error@-4 6{{generic class 'X' has self-referential generic requirements}}
1418
var type: T { return Swift.type(of: self) } // expected-error{{cannot convert return expression of type 'X<T>.Type' to return type 'T'}}
1519
}
1620

@@ -45,7 +49,7 @@ public protocol P {
4549
}
4650

4751
public struct S<A: P> where A.T == S<A> {
48-
// expected-error@-1 3{{generic struct 'S' has self-referential generic requirements}}
52+
// expected-error@-1 6{{generic struct 'S' has self-referential generic requirements}}
4953
func f(a: A.T) {
5054
g(a: id(t: a)) // `a` has error type which is diagnosed as circular reference
5155
_ = A.T.self
@@ -70,7 +74,7 @@ protocol PI {
7074
}
7175

7276
struct SI<A: PI> : I where A : I, A.T == SI<A> {
73-
// expected-error@-1 3{{generic struct 'SI' has self-referential generic requirements}}
77+
// expected-error@-1 6{{generic struct 'SI' has self-referential generic requirements}}
7478
func ggg<T : I>(t: T.Type) -> T {
7579
return T()
7680
}
@@ -97,9 +101,9 @@ struct S5<A: PI> : I where A : I, A.T == S4<A> { }
97101

98102
// Used to hit ArchetypeBuilder assertions
99103
struct SU<A: P> where A.T == SU {
100-
// expected-error@-1 3{{generic struct 'SU' has self-referential generic requirements}}
104+
// expected-error@-1 6{{generic struct 'SU' has self-referential generic requirements}}
101105
}
102106

103107
struct SIU<A: PI> : I where A : I, A.T == SIU {
104-
// expected-error@-1 3{{generic struct 'SIU' has self-referential generic requirements}}
108+
// expected-error@-1 6{{generic struct 'SIU' has self-referential generic requirements}}
105109
}

0 commit comments

Comments
 (0)