Skip to content

Commit 6306884

Browse files
committed
Sema: Only call diagnoseMissingWitnesses() once
1 parent 18c8148 commit 6306884

File tree

2 files changed

+9
-12
lines changed

2 files changed

+9
-12
lines changed

lib/Sema/TypeCheckProtocol.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5126,16 +5126,13 @@ void ConformanceChecker::checkConformance(MissingWitnessDiagnosisKind Kind) {
51265126
// Resolve all of the type witnesses.
51275127
resolveTypeWitnesses();
51285128

5129-
// Diagnose missing type witnesses for now.
5130-
diagnoseMissingWitnesses(Kind, /*Delayed=*/false);
5131-
51325129
// Check the requirements from the requirement signature.
51335130
ensureRequirementsAreSatisfied();
51345131

51355132
// Check non-type requirements.
51365133
resolveValueWitnesses();
51375134

5138-
// Diagnose missing value witnesses.
5135+
// Diagnose any missing witnesses.
51395136
diagnoseMissingWitnesses(Kind, /*Delayed=*/false);
51405137

51415138
emitDelayedDiags();

test/decl/protocol/conforms/fixit_stub.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -154,18 +154,18 @@ protocol ProtocolChain2 : ProtocolChain1 {
154154
class Adopter15 : ProtocolChain2 {} //expected-error {{type 'Adopter15' does not conform to protocol 'ProtocolChain2'}} expected-error {{type 'Adopter15' does not conform to protocol 'ProtocolChain1'}}
155155

156156
protocol ProtocolParallel1 {
157-
associatedtype Foo1 // expected-note {{protocol requires nested type 'Foo1'; add nested type 'Foo1' for conformance}}{{171:57-57=\n typealias Foo1 = <#type#>\n\n typealias Foo2 = <#type#>\n\n typealias Foo3 = <#type#>\n\n func Foo4() {\n <#code#>\n \}\n\n typealias Bar1 = <#type#>\n\n typealias Bar2 = <#type#>\n\n typealias Bar3 = <#type#>\n}}
158-
associatedtype Foo2 // expected-note {{protocol requires nested type 'Foo2'; add nested type 'Foo2' for conformance}}{{171:57-57=\n typealias Foo1 = <#type#>\n\n typealias Foo2 = <#type#>\n\n typealias Foo3 = <#type#>\n\n func Foo4() {\n <#code#>\n \}\n\n typealias Bar1 = <#type#>\n\n typealias Bar2 = <#type#>\n\n typealias Bar3 = <#type#>\n}}
159-
associatedtype Foo3 // expected-note {{protocol requires nested type 'Foo3'; add nested type 'Foo3' for conformance}}{{171:57-57=\n typealias Foo1 = <#type#>\n\n typealias Foo2 = <#type#>\n\n typealias Foo3 = <#type#>\n\n func Foo4() {\n <#code#>\n \}\n\n typealias Bar1 = <#type#>\n\n typealias Bar2 = <#type#>\n\n typealias Bar3 = <#type#>\n}}
157+
associatedtype Foo1 // expected-note {{protocol requires nested type 'Foo1'; add nested type 'Foo1' for conformance}}{{171:57-57=\n typealias Foo1 = <#type#>\n\n typealias Foo2 = <#type#>\n\n typealias Foo3 = <#type#>\n\n func Foo4() {\n <#code#>\n \}\n\n typealias Bar1 = <#type#>\n\n typealias Bar2 = <#type#>\n\n typealias Bar3 = <#type#>\n\n func Bar4() {\n <#code#>\n \}\n}}
158+
associatedtype Foo2 // expected-note {{protocol requires nested type 'Foo2'; add nested type 'Foo2' for conformance}}{{171:57-57=\n typealias Foo1 = <#type#>\n\n typealias Foo2 = <#type#>\n\n typealias Foo3 = <#type#>\n\n func Foo4() {\n <#code#>\n \}\n\n typealias Bar1 = <#type#>\n\n typealias Bar2 = <#type#>\n\n typealias Bar3 = <#type#>\n\n func Bar4() {\n <#code#>\n \}\n}}
159+
associatedtype Foo3 // expected-note {{protocol requires nested type 'Foo3'; add nested type 'Foo3' for conformance}}{{171:57-57=\n typealias Foo1 = <#type#>\n\n typealias Foo2 = <#type#>\n\n typealias Foo3 = <#type#>\n\n func Foo4() {\n <#code#>\n \}\n\n typealias Bar1 = <#type#>\n\n typealias Bar2 = <#type#>\n\n typealias Bar3 = <#type#>\n\n func Bar4() {\n <#code#>\n \}\n}}
160160
// FIXME: Why do we add stubs for all missing requirements when the note implies a single one?
161-
func Foo4() // expected-note {{protocol requires function 'Foo4()' with type '() -> ()'; add a stub for conformance}}{{171:57-57=\n typealias Foo1 = <#type#>\n\n typealias Foo2 = <#type#>\n\n typealias Foo3 = <#type#>\n\n func Foo4() {\n <#code#>\n \}\n\n typealias Bar1 = <#type#>\n\n typealias Bar2 = <#type#>\n\n typealias Bar3 = <#type#>\n}}
161+
func Foo4() // expected-note {{protocol requires function 'Foo4()' with type '() -> ()'; add a stub for conformance}}{{171:57-57=\n typealias Foo1 = <#type#>\n\n typealias Foo2 = <#type#>\n\n typealias Foo3 = <#type#>\n\n func Foo4() {\n <#code#>\n \}\n\n typealias Bar1 = <#type#>\n\n typealias Bar2 = <#type#>\n\n typealias Bar3 = <#type#>\n\n func Bar4() {\n <#code#>\n \}\n}}
162162
}
163163

164164
protocol ProtocolParallel2 {
165-
associatedtype Bar1 // expected-note {{protocol requires nested type 'Bar1'; add nested type 'Bar1' for conformance}}{{171:57-57=\n typealias Foo1 = <#type#>\n\n typealias Foo2 = <#type#>\n\n typealias Foo3 = <#type#>\n\n func Foo4() {\n <#code#>\n \}\n\n typealias Bar1 = <#type#>\n\n typealias Bar2 = <#type#>\n\n typealias Bar3 = <#type#>\n}}
166-
associatedtype Bar2 // expected-note {{protocol requires nested type 'Bar2'; add nested type 'Bar2' for conformance}}{{171:57-57=\n typealias Foo1 = <#type#>\n\n typealias Foo2 = <#type#>\n\n typealias Foo3 = <#type#>\n\n func Foo4() {\n <#code#>\n \}\n\n typealias Bar1 = <#type#>\n\n typealias Bar2 = <#type#>\n\n typealias Bar3 = <#type#>\n}}
167-
associatedtype Bar3 // expected-note {{protocol requires nested type 'Bar3'; add nested type 'Bar3' for conformance}}{{171:57-57=\n typealias Foo1 = <#type#>\n\n typealias Foo2 = <#type#>\n\n typealias Foo3 = <#type#>\n\n func Foo4() {\n <#code#>\n \}\n\n typealias Bar1 = <#type#>\n\n typealias Bar2 = <#type#>\n\n typealias Bar3 = <#type#>\n}}
168-
func Bar4() // expected-note {{protocol requires function 'Bar4()' with type '() -> ()'; add a stub for conformance}}{{171:57-57=\n func Bar4() {\n <#code#>\n \}\n}}
165+
associatedtype Bar1 // expected-note {{protocol requires nested type 'Bar1'; add nested type 'Bar1' for conformance}}{{171:57-57=\n typealias Foo1 = <#type#>\n\n typealias Foo2 = <#type#>\n\n typealias Foo3 = <#type#>\n\n func Foo4() {\n <#code#>\n \}\n\n typealias Bar1 = <#type#>\n\n typealias Bar2 = <#type#>\n\n typealias Bar3 = <#type#>\n\n func Bar4() {\n <#code#>\n \}\n}}
166+
associatedtype Bar2 // expected-note {{protocol requires nested type 'Bar2'; add nested type 'Bar2' for conformance}}{{171:57-57=\n typealias Foo1 = <#type#>\n\n typealias Foo2 = <#type#>\n\n typealias Foo3 = <#type#>\n\n func Foo4() {\n <#code#>\n \}\n\n typealias Bar1 = <#type#>\n\n typealias Bar2 = <#type#>\n\n typealias Bar3 = <#type#>\n\n func Bar4() {\n <#code#>\n \}\n}}
167+
associatedtype Bar3 // expected-note {{protocol requires nested type 'Bar3'; add nested type 'Bar3' for conformance}}{{171:57-57=\n typealias Foo1 = <#type#>\n\n typealias Foo2 = <#type#>\n\n typealias Foo3 = <#type#>\n\n func Foo4() {\n <#code#>\n \}\n\n typealias Bar1 = <#type#>\n\n typealias Bar2 = <#type#>\n\n typealias Bar3 = <#type#>\n\n func Bar4() {\n <#code#>\n \}\n}}
168+
func Bar4() // expected-note {{protocol requires function 'Bar4()' with type '() -> ()'; add a stub for conformance}}{{171:57-57=\n typealias Foo1 = <#type#>\n\n typealias Foo2 = <#type#>\n\n typealias Foo3 = <#type#>\n\n func Foo4() {\n <#code#>\n \}\n\n typealias Bar1 = <#type#>\n\n typealias Bar2 = <#type#>\n\n typealias Bar3 = <#type#>\n\n func Bar4() {\n <#code#>\n \}\n}}
169169
}
170170

171171
class Adopter16 : ProtocolParallel1, ProtocolParallel2 {} // expected-error {{type 'Adopter16' does not conform to protocol 'ProtocolParallel1'}} expected-error {{type 'Adopter16' does not conform to protocol 'ProtocolParallel2'}}

0 commit comments

Comments
 (0)