blob: 743b91680ef6b27d145d333d78cd8b5bf25100d9 [file] [log] [blame]
// RUN: %target-typecheck-verify-swift -parse-as-library
// Generic class locally defined in non-generic function (rdar://problem/20116710)
func f3() {
class B<T> {}
class C : B<Int> {}
_ = B<Int>()
_ = C()
}
// Type defined inside a closure (rdar://problem/31803589)
func hasAClosure() {
_ = {
enum E<T> { case a(T) }
let _ = E.a("hi")
let _ = E<String>.a("hi")
let _: E = .a("hi")
let _: E<String> = .a("hi")
}
}
protocol Racoon {
associatedtype Stripes
}
// Types inside generic functions -- not supported yet
func outerGenericFunction<T>(_ t: T) {
struct InnerNonGeneric { // expected-error{{type 'InnerNonGeneric' cannot be nested in generic function 'outerGenericFunction'}}
func nonGenericMethod(_ t: T) {}
func genericMethod<V>(_ t: T) -> V where V : Racoon, V.Stripes == T {}
}
struct InnerGeneric<U> { // expected-error{{type 'InnerGeneric' cannot be nested in generic function 'outerGenericFunction'}}
func nonGenericMethod(_ t: T, u: U) {}
func genericMethod<V>(_ t: T, u: U) -> V where V : Racoon, V.Stripes == T {}
}
_ = {
struct ConcreteInClosure { // expected-error{{type 'ConcreteInClosure' cannot be nested in closure in generic context}}
}
struct GenericInClosure<U> { // expected-error{{type 'GenericInClosure' cannot be nested in closure in generic context}}
}
}
}
class OuterNonGenericClass {
func genericFunction<T>(_ t: T) {
class InnerNonGenericClass : OuterNonGenericClass { // expected-error {{type 'InnerNonGenericClass' cannot be nested in generic function 'genericFunction'}}
let t: T
init(t: T) { super.init(); self.t = t }
}
class InnerGenericClass<U> : OuterNonGenericClass // expected-error {{type 'InnerGenericClass' cannot be nested in generic function 'genericFunction'}}
where U : Racoon, U.Stripes == T {
let t: T
init(t: T) { super.init(); self.t = t }
}
}
}
class OuterGenericClass<T> {
func genericFunction<U>(_ t: U) {
class InnerNonGenericClass1 : OuterGenericClass { // expected-error {{type 'InnerNonGenericClass1' cannot be nested in generic function 'genericFunction'}}
let t: T
init(t: T) { super.init(); self.t = t }
}
class InnerNonGenericClass2 : OuterGenericClass<Int> { // expected-error {{type 'InnerNonGenericClass2' cannot be nested in generic function 'genericFunction'}}
let t: T
init(t: T) { super.init(); self.t = t }
}
class InnerNonGenericClass3 : OuterGenericClass<T> { // expected-error {{type 'InnerNonGenericClass3' cannot be nested in generic function 'genericFunction'}}
let t: T
init(t: T) { super.init(); self.t = t }
}
class InnerGenericClass<U> : OuterGenericClass<U> // expected-error {{type 'InnerGenericClass' cannot be nested in generic function 'genericFunction'}}
where U : Racoon, U.Stripes == T {
let t: T
init(t: T) { super.init(); self.t = t }
}
}
}
// Name lookup within local classes.
func f5<T, U>(x: T, y: U) {
struct Local { // expected-error {{type 'Local' cannot be nested in generic function 'f5(x:y:)'}}
func f() {
_ = 17 as T // expected-error{{'Int' is not convertible to 'T'}} {{14-16=as!}}
_ = 17 as U // okay: refers to 'U' declared within the local class
}
typealias U = Int
}
}
// Issue with gatherAllSubstitutions().
struct OuterGenericStruct<A> {
class MiddleNonGenericClass {
func nonGenericFunction() {
class InnerGenericClass<T> : MiddleNonGenericClass {
// expected-error@-1 {{type 'InnerGenericClass' cannot be nested in generic function 'nonGenericFunction()'}}
override init() { super.init() }
}
}
}
func middleFunction() {
struct ConformingType : Racoon {
// expected-error@-1 {{type 'ConformingType' cannot be nested in generic function 'middleFunction()'}}
typealias Stripes = A
}
}
}
// Issue with diagnoseUnknownType().
func genericFunction<T>(t: T) {
class First : Second<T>.UnknownType { }
// expected-error@-1 {{type 'First' cannot be nested in generic function 'genericFunction(t:)'}}
// expected-error@-2 {{'UnknownType' is not a member type of 'Second<T>'}}
class Second<T> : Second { }
// expected-error@-1 {{type 'Second' cannot be nested in generic function 'genericFunction(t:)'}}
// expected-error@-2 {{'Second' inherits from itself}}
}
// Spurious "Self or associated type requirements" diagnostic.
protocol ProtoWithAssocType {
associatedtype T = Int
}
func freeFunction() {
struct ConformingType : ProtoWithAssocType {
typealias T = Int
func method() -> ProtoWithAssocType {}
// expected-error@-1 {{can only be used as a generic constraint because it has Self or associated type requirements}}
}
}
// Superclass lookup archetype vs interface type mixup
class Generic<T> {
struct Nested {}
func outerMethod() {
class Inner : Generic<T> { // expected-error {{type 'Inner' cannot be nested in generic function 'outerMethod()'}}
func innerMethod() -> Nested {}
}
}
}