mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Doing it in the post-walk meant we ended up walking the children twice, which lead to duplicate diagnostics and incorrect inference of the level of application for function references. Move it to the pre-walk, ensuring that we resolve any operator references before folding.
107 lines
3.3 KiB
Swift
107 lines
3.3 KiB
Swift
// RUN: %target-typecheck-verify-swift
|
|
|
|
class Base {}
|
|
class Derived: Base {
|
|
override init() {
|
|
// expected-error@+1 {{'super' may be used only to access a superclass member, subscript, or initializer}}
|
|
let _ = super
|
|
}
|
|
|
|
deinit {
|
|
// expected-error@+2 {{'super' may be used only to access a superclass member, subscript, or initializer}}
|
|
// expected-error@+1 {{cannot call value of non-function type 'Base'}}
|
|
super()
|
|
}
|
|
|
|
var unsupported: Base {
|
|
get {
|
|
// expected-error@+1 {{'super' may be used only to access a superclass member, subscript, or initializer}}
|
|
super
|
|
}
|
|
}
|
|
|
|
subscript(_: Base) -> Bool {
|
|
true
|
|
}
|
|
|
|
func unsupported(
|
|
// expected-error@+1 {{'super' may be used only to access a superclass member, subscript, or initializer}}
|
|
_: Base = super
|
|
) {
|
|
// expected-error@+2 {{'super' may be used only to access a superclass member, subscript, or initializer}}
|
|
// expected-warning@+1 {{expression of type 'Base' is unused}}
|
|
super
|
|
// expected-error@+2 {{'super' may be used only to access a superclass member, subscript, or initializer}}
|
|
// expected-error@+1 {{cannot call value of non-function type 'Base'}}
|
|
super(0)
|
|
// expected-error@+2 {{'super' may be used only to access a superclass member, subscript, or initializer}}
|
|
// expected-warning@+1 {{expression of type 'Base' is unused}}
|
|
super
|
|
[1] // expected-warning{{expression of type '[Int]' is unused}}
|
|
|
|
// expected-error@+1 {{'super' may be used only to access a superclass member, subscript, or initializer}}
|
|
let _ = self[super]
|
|
|
|
// expected-error@+1 {{'super' may be used only to access a superclass member, subscript, or initializer}}
|
|
_ = (0, super)
|
|
|
|
func nested() {
|
|
let _ = [
|
|
// expected-error@+1 {{'super' may be used only to access a superclass member, subscript, or initializer}}
|
|
super
|
|
]
|
|
}
|
|
}
|
|
}
|
|
|
|
extension Derived {
|
|
func unsupportedInExtension() {
|
|
// expected-error@+1 {{'super' may be used only to access a superclass member, subscript, or initializer}}
|
|
let _ = super
|
|
}
|
|
}
|
|
|
|
// Do not complain about a missing/illegal parent expression unless 'super' is
|
|
// legal in context.
|
|
|
|
func unsupported() {
|
|
// expected-error@+1 {{'super' cannot be used outside of a class computed property, method, initializer, deinitializer, or subscript}}
|
|
super
|
|
}
|
|
protocol P: Derived {}
|
|
extension P {
|
|
func unsupported() {
|
|
// expected-error@+1 {{'super' cannot be used in non-class type 'P'}}
|
|
super
|
|
}
|
|
}
|
|
enum E {
|
|
var unsupported: Void {
|
|
// expected-error@+1 {{'super' cannot be used in non-class type 'E'}}
|
|
super
|
|
}
|
|
}
|
|
class Root {
|
|
// expected-error@+1 {{'super' cannot be used outside of a class computed property, method, initializer, deinitializer, or subscript}}
|
|
let sup = super
|
|
|
|
init() {
|
|
// expected-error@+1 {{'super' cannot be used in class 'Root' because it has no superclass}}
|
|
super
|
|
}
|
|
|
|
func unsupported(
|
|
// expected-error@+1 {{'super' cannot be used in class 'Root' because it has no superclass}}
|
|
_: Root = super
|
|
) {
|
|
// expected-error@+1 {{'super' cannot be used in class 'Root' because it has no superclass}}
|
|
super
|
|
struct S {
|
|
func unsupported() {
|
|
// expected-error@+1 {{'super' cannot be used in non-class type 'S'}}
|
|
super
|
|
}
|
|
}
|
|
}
|
|
}
|