// RUN: %target-typecheck-verify-swift class Base {} class Derived : Base {} func casts( baseT: Base, baseU: Base, baseInt: Base, baseString: Base, derived: Derived) { let _ = baseT as? Base let _ = baseT as? Base let _ = baseT as? Base let _ = baseT as? Derived let _ = baseInt as? Base let _ = baseInt as? Base // expected-warning {{always fails}} let _ = baseInt as? Derived let _ = derived as? Base let _ = derived as? Base // expected-warning {{always succeeds}} let _ = derived as? Base // expected-warning {{always fails}} } class Pair {} class DerivedPair : Pair {} func invalidCast(pair: Pair, derivedPair: Derived) { let _ = pair as? DerivedPair // expected-warning@-1 {{cast from 'Pair' to unrelated type 'DerivedPair' always fails}} let _ = derivedPair as? Pair // expected-warning@-1 {{cast from 'Derived' to unrelated type 'Pair' always fails}} } func archetypeCasts, BI : Base, BS : Base, 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 }