blob: fe1a2a36e2cb3593f4628e8fd9c01fc4f9881df7 [file] [log] [blame]
// RUN: %target-typecheck-verify-swift
class Base<T> {}
class Derived : Base<Int> {}
func casts<T, U>(
baseT: Base<T>, baseU: Base<U>,
baseInt: Base<Int>, baseString: Base<String>,
derived: Derived) {
let _ = baseT as? Base<U>
let _ = baseT as? Base<Int>
let _ = baseT as? Base<String>
let _ = baseT as? Derived
let _ = baseInt as? Base<T>
let _ = baseInt as? Base<String> // expected-warning {{always fails}}
let _ = baseInt as? Derived
let _ = derived as? Base<T>
let _ = derived as? Base<Int> // expected-warning {{always succeeds}}
let _ = derived as? Base<String> // expected-warning {{always fails}}
}
class Pair<T, U> {}
class DerivedPair : Pair<Int, String> {}
func invalidCast<T>(pair: Pair<T, T>, derivedPair: Derived) {
let _ = pair as? DerivedPair
// expected-warning@-1 {{cast from 'Pair<T, T>' to unrelated type 'DerivedPair' always fails}}
let _ = derivedPair as? Pair<T, T>
// expected-warning@-1 {{cast from 'Derived' to unrelated type 'Pair<T, T>' always fails}}
}
func archetypeCasts<T, BT : Base<T>, BI : Base<Int>, BS : Base<String>, D : Derived>(
bt: BT,
bi: BI,
bs: BS,
d: D) {
let _ = bt as? BI
let _ = bt as? BS
let _ = bt as? D
let _ = bi as? BT
let _ = bi as? BS // expected-warning {{always fails}}
let _ = bt as? D
let _ = d as? BI
let _ = d as? BS // expected-warning {{always fails}}
let _ = d as? BT
}