mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
When building a generic signature, we would drop requirements where the LHS or RHS was a DependentMemberType with an unresolved associated type, however we didn't perform the same check for DependentMemberTypes that are nested inside structural types.
92 lines
2.6 KiB
Swift
92 lines
2.6 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 typealias 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 {{'where' clause cannot be attached to a protocol declaration}}
|
|
|
|
associatedtype vav where A : B // expected-error {{'where' clause cannot be attached to an associated type declaration}}
|
|
}
|
|
|
|
|
|
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
|
|
}
|
|
}
|
|
}
|