mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Avoid type-checking the `where` clause when computing the interface type of a variable bound in the pattern of the loop as otherwise that will trigger cycles and give us an ErrorType result.
97 lines
3.5 KiB
Swift
97 lines
3.5 KiB
Swift
// FIXME: Fails with non-source-ordering
|
|
// RUN: %batch-code-completion -source-order-completion
|
|
|
|
class Gen {
|
|
func IntGen() -> Int { return 0 }
|
|
func IntOpGen() -> Int? {return 0}
|
|
func IntSeqGen() -> [Int] {return [0]}
|
|
}
|
|
|
|
class C {
|
|
|
|
func f1(_ Seq : [Int], I : Int, G : Gen) {
|
|
for i in #^LOOP_1^#
|
|
}
|
|
// LOOP_1-DAG: Decl[LocalVar]/Local/TypeRelation[Convertible]: Seq[#[Int]#]{{; name=.+$}}
|
|
// LOOP_1-DAG: Decl[LocalVar]/Local: I[#Int#]{{; name=.+$}}
|
|
// LOOP_1-DAG: Decl[LocalVar]/Local: G[#Gen#]{{; name=.+$}}
|
|
// LOOP_1-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: f1({#(Seq): [Int]#}, {#I: Int#}, {#G: Gen#})[#Void#]{{; name=.+$}}
|
|
// LOOP_1-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: f2({#(Seq): [Int]#}, {#I: Int#}, {#G: Gen#})[#Void#]{{; name=.+$}}
|
|
|
|
func f2(_ Seq : [Int], I : Int, G: Gen) {
|
|
for i in #^LOOP_2?check=LOOP_2;check=LOOP_2_NEGATIVE^# {
|
|
|
|
}
|
|
}
|
|
// LOOP_2-DAG: Decl[LocalVar]/Local/TypeRelation[Convertible]: Seq[#[Int]#]{{; name=.+$}}
|
|
// LOOP_2-DAG: Decl[LocalVar]/Local: I[#Int#]{{; name=.+$}}
|
|
// LOOP_2-DAG: Decl[LocalVar]/Local: G[#Gen#]{{; name=.+$}}
|
|
// LOOP_2-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: f1({#(Seq): [Int]#}, {#I: Int#}, {#G: Gen#})[#Void#]{{; name=.+$}}
|
|
// LOOP_2-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: f2({#(Seq): [Int]#}, {#I: Int#}, {#G: Gen#})[#Void#]{{; name=.+$}}
|
|
|
|
// LOOP_2_NEGATIVE-NOT: TypeRelation[{{.*}}]: SequenceType[#SequenceType#];
|
|
|
|
func f3(_ G : Gen) {
|
|
for i in G.#^LOOP_3^#
|
|
}
|
|
|
|
// LOOP_3-DAG: Decl[InstanceMethod]/CurrNominal: IntGen()[#Int#]{{; name=.+$}}
|
|
// LOOP_3-DAG: Decl[InstanceMethod]/CurrNominal: IntOpGen()[#Int?#]{{; name=.+$}}
|
|
// LOOP_3-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]: IntSeqGen()[#[Int]#]{{; name=.+$}}
|
|
|
|
func f4(_ G : Gen) {
|
|
for i in G.#^LOOP_4^# {
|
|
|
|
}
|
|
}
|
|
|
|
// LOOP_4-DAG: Decl[InstanceMethod]/CurrNominal: IntGen()[#Int#]{{; name=.+$}}
|
|
// LOOP_4-DAG: Decl[InstanceMethod]/CurrNominal: IntOpGen()[#Int?#]{{; name=.+$}}
|
|
// LOOP_4-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]: IntSeqGen()[#[Int]#]{{; name=.+$}}
|
|
|
|
func f5(_ a: [C]) {
|
|
do {
|
|
for user in a {
|
|
user.#^LOOP_5^#
|
|
// LOOP_5-DAG: Keyword[self]/CurrNominal: self[#C#];
|
|
// LOOP_5-DAG: Decl[InstanceMethod]/CurrNominal: f1({#(Seq): [Int]#}, {#I: Int#}, {#G: Gen#})[#Void#];
|
|
// LOOP_5-DAG: Decl[InstanceMethod]/CurrNominal: f2({#(Seq): [Int]#}, {#I: Int#}, {#G: Gen#})[#Void#];
|
|
// LOOP_5-DAG: Decl[InstanceMethod]/CurrNominal: f3({#(G): Gen#})[#Void#];
|
|
// LOOP_5-DAG: Decl[InstanceMethod]/CurrNominal: f4({#(G): Gen#})[#Void#];
|
|
// LOOP_5-DAG: Decl[InstanceMethod]/CurrNominal: f5({#(a): [C]#})[#Void#];
|
|
}
|
|
} catch {}
|
|
}
|
|
}
|
|
|
|
// https://github.com/apple/swift/issues/58633
|
|
do {
|
|
for value #^LOOP_6^#
|
|
}
|
|
// LOOP_6: Begin completions, 1 items
|
|
// LOOP_6-CHECK-NEXT: Keyword[in]/None: in; name=in
|
|
|
|
do {
|
|
for value #^LOOP_7^# 1..<7 {}
|
|
}
|
|
// LOOP_7: Begin completions
|
|
|
|
// Pack Iteration
|
|
do {
|
|
for t in #^LOOP_8^# {}
|
|
}
|
|
// LOOP_8-DAG: Keyword[repeat]/None: repeat; name=repeat
|
|
|
|
do {
|
|
struct S {
|
|
var foo: Bool
|
|
}
|
|
func bar(_ xs: [S]) {
|
|
// Make sure we can resolve 'x' here without causing a request cycle.
|
|
for x in xs where x.foo {
|
|
x.#^LOOP_9^#
|
|
// LOOP_9-DAG: Decl[InstanceVar]/CurrNominal: foo[#Bool#]; name=foo
|
|
}
|
|
}
|
|
}
|