Files
swift-mirror/test/decl/protocol/protocol_enum_witness.swift
Alex Hoppen 66104395d7 [Sema/SourceKit] Emit same diagnostics for missing protocol requirements on the command line and in SourceKit
Some editors use diagnostics from SourceKit to replace build issues. This causes issues if the diagnostics from SourceKit are formatted differently than the build issues. Make sure they are rendered the same way, removing most uses of `DiagnosticsEditorMode`.

To do so, always emit the `add stubs for conformance` note (which previously was only emitted in editor mode) and remove all `; add <something>` suffixes from notes that state which requirements are missing.

rdar://129283608
2024-08-07 14:01:30 -07:00

172 lines
5.1 KiB
Swift

// RUN: %target-typecheck-verify-swift
////// WITNESS MATCHING FOR PAYLOAD-LESS ENUMS //////
// Requirement is settable, so witness cannot satisfy it //
protocol Foo1 {
static var bar: Self { get set } // expected-note {{protocol requires property 'bar' with type 'Bar1'}}
}
enum Bar1: Foo1 {
// expected-error@-1 {{type 'Bar1' does not conform to protocol 'Foo1'}}
// expected-note@-2 {{add stubs for conformance}}
case bar // expected-note {{candidate is not settable, but protocol requires it}}
}
// Witness has associated values, which is unsupported //
protocol Foo2 {
static var bar: Self { get set } // expected-note {{protocol requires property 'bar' with type 'Bar2'}}
}
enum Bar2: Foo2 {
// expected-error@-1 {{type 'Bar2' does not conform to protocol 'Foo2'}}
// expected-note@-2 {{add stubs for conformance}}
case bar(Int) // expected-note {{candidate is an enum case with associated values, but protocol does not allow it}}
}
protocol Foo3 {
static var bar: Self { get } // expected-note {{protocol requires property 'bar' with type 'Bar3'}}
}
enum Bar3: Foo3 {
// expected-error@-1 {{type 'Bar3' does not conform to protocol 'Foo3'}}
// expected-note@-2 {{add stubs for conformance}}
case bar(Int) // expected-note {{candidate is an enum case with associated values, but protocol does not allow it}}
}
// Requirement is not static, so it cannot be witnessed by the enum case //
protocol Foo4 {
var bar: Self { get } // expected-note {{protocol requires property 'bar' with type 'Bar4'}}
}
enum Bar4: Foo4 {
// expected-error@-1 {{type 'Bar4' does not conform to protocol 'Foo4'}}
// expected-note@-2 {{add stubs for conformance}}
case bar // expected-note {{candidate operates on a type, not an instance as required}}
}
protocol Foo5 {
var bar: Self { get set } // expected-note {{protocol requires property 'bar' with type 'Bar5'}}
}
enum Bar5: Foo5 {
// expected-error@-1 {{type 'Bar5' does not conform to protocol 'Foo5'}}
// expected-note@-2 {{add stubs for conformance}}
case bar // expected-note {{candidate operates on a type, not an instance as required}}
}
// Requirement does not have Self type, so it cannot be witnessed by the enum case //
protocol Foo6 {
static var bar: Int { get } // expected-note {{protocol requires property 'bar' with type 'Int'}}
}
enum Bar6: Foo6 {
// expected-error@-1 {{type 'Bar6' does not conform to protocol 'Foo6'}}
// expected-note@-2 {{add stubs for conformance}}
case bar // expected-note {{candidate has non-matching type '(Bar6.Type) -> Bar6'}}
}
// Valid cases
protocol Foo7 {
static var bar: Self { get }
}
enum Bar7: Foo7 {
case bar // Okay
}
protocol Foo8 {
static var bar: Bar8 { get }
}
enum Bar8: Foo8 {
case bar // Okay
}
////// WITNESS MATCHING FOR PAYLOAD ENUMS //////
// Witness does not have argument label, but requirement does
protocol Foo9 {
static func bar(f: Int) -> Self // expected-note {{requirement 'bar(f:)' declared here}}
}
enum Bar9: Foo9 {
case bar(_ f: Int) // expected-error {{enum case 'bar' has different argument labels from those required by protocol 'Foo9' ('bar(f:)')}}
}
// Witness does not have any labels, but requirement does
protocol Foo10 {
static func bar(g: Int) -> Self // expected-note {{requirement 'bar(g:)' declared here}}
}
enum Bar10: Foo10 {
case bar(Int) // expected-error {{enum case 'bar' has different argument labels from those required by protocol 'Foo10' ('bar(g:)')}}
}
// Witness does not have a payload, but requirement is a function
protocol Foo11 {
static func bar(h: Int) -> Self // expected-note {{protocol requires function 'bar(h:)' with type '(Int) -> Bar11'}}
}
enum Bar11: Foo11 {
// expected-error@-1 {{type 'Bar11' does not conform to protocol 'Foo11'}}
// expected-note@-2 {{add stubs for conformance}}
case bar // expected-note {{candidate has non-matching type '(Bar11.Type) -> Bar11'}}
}
// Witness is static, but requirement is not
protocol Foo12 {
func bar(i: Int) -> Self // expected-note {{protocol requires function 'bar(i:)' with type '(Int) -> Bar12'}}
}
enum Bar12: Foo12 {
// expected-error@-1 {{type 'Bar12' does not conform to protocol 'Foo12'}}
// expected-note@-2 {{add stubs for conformance}}
case bar // expected-note {{candidate operates on a type, not an instance as required}}
}
// Valid cases
protocol Foo13 {
static func bar(j: Int) -> Self
static func baz(_ k: String) -> Bar13
}
enum Bar13: Foo13 {
case bar(j: Int) // Okay
case baz(_ k: String) // Okay
}
////// REQUIREMENT IS A THROWING FUNCTION //////
protocol ThrowingFactory {
static func horse(_: Int) throws -> Self
}
enum HorseFactory : ThrowingFactory {
case horse(Int)
}
protocol MissingAccessorsVar {
static var bar: Self // expected-error {{property in protocol must have explicit { get } or { get set } specifier}}
}
enum Bar14: MissingAccessorsVar { // OK
case bar
}
protocol MissingAccessorsLet {
static let bar: Self // expected-error {{protocols cannot require properties to be immutable; declare read-only properties by using 'var' with a '{ get }' specifier}}
}
enum Bar15: MissingAccessorsLet { // OK
case bar
}