mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Rather than relying on clients to cope with the potential for circular inheritance of superclass declarations, teach SuperclassDeclRequest to establish whether circular inheritance has occurred and produce "null" in such cases. This allows other clients to avoid having to think about To benefit from this, have SuperclassTypeRequest evaluate SuperclassDeclRequest first and, if null, produce a Type(). This ensures that we don't get into an inconsistent situation where there is a superclass type but no superclass declaration.
74 lines
2.6 KiB
Swift
74 lines
2.6 KiB
Swift
// RUN: rm -rf %t/stats-dir
|
|
// RUN: mkdir -p %t/stats-dir
|
|
// RUN: %target-typecheck-verify-swift
|
|
// RUN: not %target-swift-frontend -typecheck -debug-cycles %s -build-request-dependency-graph -output-request-graphviz %t.dot -stats-output-dir %t/stats-dir 2> %t.cycles
|
|
|
|
class Left // expected-error {{'Left' inherits from itself}} expected-note {{through reference here}}
|
|
: Right.Hand { // expected-note {{through reference here}}
|
|
class Hand {}
|
|
}
|
|
|
|
class Right // expected-note {{through reference here}} expected-note{{class 'Right' declared here}}
|
|
: Left.Hand { // expected-note {{through reference here}}
|
|
class Hand {}
|
|
}
|
|
|
|
class C : B { } // expected-error{{'C' inherits from itself}}
|
|
class B : A { } // expected-note{{class 'B' declared here}}
|
|
class A : C { } // expected-note{{class 'A' declared here}}
|
|
|
|
class TrivialCycle : TrivialCycle {} // expected-error{{'TrivialCycle' inherits from itself}}
|
|
protocol P : P {} // expected-error {{protocol 'P' refines itself}}
|
|
|
|
class Isomorphism : Automorphism { }
|
|
class Automorphism : Automorphism { } // expected-error{{'Automorphism' inherits from itself}}
|
|
|
|
let _ = A()
|
|
|
|
class Outer {
|
|
class Inner : Outer {}
|
|
}
|
|
|
|
class Outer2 // expected-error {{'Outer2' inherits from itself}} expected-note {{through reference here}}
|
|
: Outer2.Inner { // expected-note {{through reference here}}
|
|
|
|
class Inner {}
|
|
}
|
|
|
|
class Outer3 // expected-error {{'Outer3' inherits from itself}} expected-note {{through reference here}}
|
|
: Outer3.Inner<Int> { // expected-note {{through reference here}}
|
|
class Inner<T> {}
|
|
}
|
|
|
|
// CHECK: ===CYCLE DETECTED===
|
|
// CHECK-LABEL: `--{{.*}}HasCircularInheritanceRequest(circular_inheritance.(file).Left@
|
|
// CHECK-NEXT: `--{{.*}}SuperclassDeclRequest({{.*Left}}
|
|
// CHECK: `--{{.*}}InheritedDeclsReferencedRequest(circular_inheritance.(file).Left@
|
|
// CHECK: `--{{.*}}SuperclassDeclRequest
|
|
// CHECK: `--{{.*}}InheritedDeclsReferencedRequest(circular_inheritance.(file).Right@
|
|
// CHECK: `--{{.*}}SuperclassDeclRequest{{.*(cyclic dependency)}}
|
|
|
|
// CHECK-DOT: digraph Dependencies
|
|
// CHECK-DOT: label="InheritedTypeRequest
|
|
|
|
protocol Initable {
|
|
init()
|
|
}
|
|
|
|
protocol Shape : Circle {}
|
|
|
|
class Circle : Initable & Circle {}
|
|
// expected-error@-1 {{'Circle' inherits from itself}}
|
|
// expected-error@-2 {{initializer requirement 'init()' can only be satisfied by a 'required' initializer in non-final class 'Circle'}}
|
|
|
|
func crash() {
|
|
_ = Circle()
|
|
}
|
|
|
|
// FIXME: We shouldn't emit the redundant "circular reference" diagnostics here.
|
|
class WithDesignatedInit : WithDesignatedInit {
|
|
// expected-error@-1 {{'WithDesignatedInit' inherits from itself}}
|
|
|
|
init(x: Int) {}
|
|
}
|