// RUN: %target-parse-verify-swift // Verify the use of unbound generic types. They are permitted in // certain places where type inference can fill in the generic // arguments, and banned everywhere else. // -------------------------------------------------- // Places where generic arguments are always required // -------------------------------------------------- struct Foo { // expected-note{{generic type 'Foo' declared here}} expected-note{{generic type 'Foo' declared here}} struct Wibble { } // expected-error{{nested in generic type}} } class Dict { } // expected-note{{generic type 'Dict' declared here}} expected-note{{generic type 'Dict' declared here}} expected-note{{generic type 'Dict' declared here}} // Cannot alias a generic type without arguments. typealias Bar = Foo // expected-error{{reference to generic type 'Foo' requires arguments in <...>}} // Cannot refer to a member of a generic type without arguments. typealias FW = Foo.Wibble // expected-error{{reference to generic type 'Foo' requires arguments in <...>}} // Cannot inherit from a generic type without arguments. class MyDict : Dict { } // expected-error{{reference to generic type 'Dict' requires arguments in <...>}} // Cannot create variables of a generic type without arguments. // FIXME: would allow it for local variables // only var x : Dict // expected-error{{reference to generic type 'Dict' requires arguments in <...>}} // Cannot create parameters of generic type without arguments. func f(x: Dict) {} // expected-error{{reference to generic type 'Dict' requires arguments in <...>}} // --------------------------------------------- // Unbound name references within a generic type // --------------------------------------------- struct GS { func f() -> GS { let gs = GS() return gs } struct Nested { // expected-error{{nested in generic type}} func ff() -> GS { let gs = GS() return gs } } struct NestedGeneric { // expected-note{{generic type 'NestedGeneric' declared here}} // expected-error{{generic type 'NestedGeneric' nested in type}} func fff() -> (GS, NestedGeneric) { let gs = GS() let ns = NestedGeneric() return (gs, ns) } } // FIXME: We're losing some sugar here by performing the substitution. func ng() -> NestedGeneric { } // expected-error{{reference to generic type 'GS.NestedGeneric' requires arguments in <...>}} } extension GS { func g() -> GS { let gs = GS() return gs } func h() { _ = GS() as GS // expected-error{{cannot convert value of type 'GS' to type 'GS' in coercion}} } } class GC { init() {} func f() -> GC { let gc = GC() return gc } } extension GC { func g() -> GC { let gc = GC() return gc } } class SomeClassWithInvalidMethod { func method() { // expected-error {{generic parameter 'T' is not used in function signature}} self.method() } } // QoI: Cannot invoke with argument list (T), expected an argument list of (T) protocol r20792596P {} // expected-note @+1 {{in call to function 'foor20792596'}} func foor20792596(x: T) -> T { return x } func callfoor20792596(x: T) -> T { return foor20792596(x) // expected-error {{generic parameter 'T' could not be inferred}} }