mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Some messages said 'typealias' and others said 'type alias'. Change everything to use 'type alias' consistently (except when it's talking about the keyword itself).
104 lines
3.1 KiB
Swift
104 lines
3.1 KiB
Swift
// RUN: %target-typecheck-verify-swift
|
|
|
|
func bet() where A : B {} // expected-error {{'where' clause cannot be attached to a non-generic declaration}}
|
|
|
|
typealias gimel where A : B // expected-error {{'where' clause cannot be attached to a non-generic declaration}}
|
|
// expected-error@-1 {{expected '=' in type alias declaration}}
|
|
|
|
class dalet where A : B {} // expected-error {{'where' clause cannot be attached to a non-generic declaration}}
|
|
|
|
protocol he where A : B { // expected-error 2 {{use of undeclared type 'A'}}
|
|
// expected-error@-1 {{use of undeclared type 'B'}}
|
|
|
|
associatedtype vav where A : B // expected-error{{use of undeclared type 'A'}}
|
|
// expected-error@-1 {{use of undeclared type 'B'}}
|
|
}
|
|
|
|
|
|
struct Lunch<T> {
|
|
struct Dinner<U> {
|
|
|
|
var leftovers: T
|
|
var transformation: (T) -> U
|
|
}
|
|
}
|
|
|
|
class Deli<Spices> {
|
|
|
|
class Pepperoni {}
|
|
struct Sausage {}
|
|
}
|
|
|
|
struct Pizzas<Spices> {
|
|
class NewYork {
|
|
}
|
|
|
|
class DeepDish {
|
|
}
|
|
}
|
|
|
|
class HotDog {
|
|
}
|
|
|
|
struct Pepper {}
|
|
struct ChiliFlakes {}
|
|
|
|
func eatDinnerConcrete(d: Pizzas<ChiliFlakes>.NewYork,
|
|
t: Deli<ChiliFlakes>.Pepperoni) {
|
|
}
|
|
|
|
func eatDinnerConcrete(d: Pizzas<Pepper>.DeepDish,
|
|
t: Deli<Pepper>.Pepperoni) {
|
|
}
|
|
|
|
func badDiagnostic1() {
|
|
|
|
_ = Lunch<Pizzas<Pepper>.NewYork>.Dinner<HotDog>( // expected-error {{expression type 'Lunch<Pizzas<Pepper>.NewYork>.Dinner<HotDog>' is ambiguous without more context}}
|
|
leftovers: Pizzas<ChiliFlakes>.NewYork(),
|
|
transformation: { _ in HotDog() })
|
|
}
|
|
|
|
func badDiagnostic2() {
|
|
|
|
let firstCourse = Pizzas<ChiliFlakes>.NewYork()
|
|
|
|
var dinner = Lunch<Pizzas<ChiliFlakes>.NewYork>.Dinner<HotDog>(
|
|
leftovers: firstCourse,
|
|
transformation: { _ in HotDog() })
|
|
|
|
let topping = Deli<Pepper>.Pepperoni()
|
|
|
|
eatDinnerConcrete(d: firstCourse, t: topping)
|
|
// expected-error@-1 {{cannot invoke 'eatDinnerConcrete' with an argument list of type '(d: Pizzas<ChiliFlakes>.NewYork, t: Deli<Pepper>.Pepperoni)'}}
|
|
// expected-note@-2 {{overloads for 'eatDinnerConcrete' exist with these partially matching parameter lists: (d: Pizzas<ChiliFlakes>.NewYork, t: Deli<ChiliFlakes>.Pepperoni), (d: Pizzas<Pepper>.DeepDish, t: Deli<Pepper>.Pepperoni)}}
|
|
|
|
}
|
|
|
|
// Real error is that we cannot infer the generic parameter from context
|
|
|
|
func takesAny(_ a: Any) {}
|
|
|
|
func badDiagnostic3() {
|
|
takesAny(Deli.self) // expected-error {{argument type 'Deli<_>.Type' does not conform to expected type 'Any'}}
|
|
}
|
|
|
|
// Crash with missing nested type inside concrete type
|
|
class OuterGeneric<T> {
|
|
class InnerGeneric<U> where U:OuterGeneric<T.NoSuchType> {
|
|
// expected-error@-1 {{'NoSuchType' is not a member type of 'T'}}
|
|
func method() {
|
|
_ = method
|
|
}
|
|
}
|
|
}
|
|
|
|
// Crash with missing types in requirements.
|
|
protocol P1 {
|
|
associatedtype A where A == ThisTypeDoesNotExist
|
|
// expected-error@-1{{use of undeclared type 'ThisTypeDoesNotExist'}}
|
|
associatedtype B where ThisTypeDoesNotExist == B
|
|
// expected-error@-1{{use of undeclared type 'ThisTypeDoesNotExist'}}
|
|
associatedtype C where ThisTypeDoesNotExist == ThisTypeDoesNotExist
|
|
// expected-error@-1 2{{use of undeclared type 'ThisTypeDoesNotExist'}}
|
|
}
|