Skip to content

Commit 196f6e1

Browse files
committed
Rust: Add type inference tests for closures and function traits
1 parent 15f3c38 commit 196f6e1

File tree

2 files changed

+318
-70
lines changed

2 files changed

+318
-70
lines changed

rust/ql/test/library-tests/type-inference/closure.rs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,80 @@ mod fn_once_trait {
6868
}
6969
}
7070

71+
mod fn_mut_trait {
72+
fn return_type<F: FnMut(bool) -> i64>(mut f: F) {
73+
let _return = f(true); // $ MISSING: type=_return:i64
74+
}
75+
76+
fn return_type_omitted<F: FnMut(bool)>(mut f: F) {
77+
let _return = f(true); // $ MISSING: type=_return:()
78+
}
79+
80+
fn argument_type<F: FnMut(bool) -> i64>(mut f: F) {
81+
let arg = Default::default(); // $ MISSING: target=default type=arg:bool
82+
f(arg);
83+
}
84+
85+
fn apply<A, B, F: FnMut(A) -> B>(mut f: F, a: A) -> B {
86+
f(a)
87+
}
88+
89+
fn apply_two(mut f: impl FnMut(i64) -> i64) -> i64 {
90+
f(2)
91+
}
92+
93+
fn test() {
94+
let f = |x: bool| -> i64 {
95+
if x {
96+
1
97+
} else {
98+
0
99+
}
100+
};
101+
let _r = apply(f, true); // $ target=apply MISSING: type=_r:i64
102+
103+
let f = |x| x + 1; // $ MISSING: type=x:i64 target=add
104+
let _r2 = apply_two(f); // $ target=apply_two certainType=_r2:i64
105+
}
106+
}
107+
108+
mod fn_trait {
109+
fn return_type<F: Fn(bool) -> i64>(f: F) {
110+
let _return = f(true); // $ MISSING: type=_return:i64
111+
}
112+
113+
fn return_type_omitted<F: Fn(bool)>(f: F) {
114+
let _return = f(true); // $ MISSING: type=_return:()
115+
}
116+
117+
fn argument_type<F: Fn(bool) -> i64>(f: F) {
118+
let arg = Default::default(); // $ MISSING: target=default type=arg:bool
119+
f(arg);
120+
}
121+
122+
fn apply<A, B, F: Fn(A) -> B>(f: F, a: A) -> B {
123+
f(a)
124+
}
125+
126+
fn apply_two(f: impl Fn(i64) -> i64) -> i64 {
127+
f(2)
128+
}
129+
130+
fn test() {
131+
let f = |x: bool| -> i64 {
132+
if x {
133+
1
134+
} else {
135+
0
136+
}
137+
};
138+
let _r = apply(f, true); // $ target=apply MISSING: type=_r:i64
139+
140+
let f = |x| x + 1; // $ MISSING: type=x:i64 target=add
141+
let _r2 = apply_two(f); // $ target=apply_two certainType=_r2:i64
142+
}
143+
}
144+
71145
mod dyn_fn_once {
72146
fn apply_boxed<A, B, F: FnOnce(A) -> B + ?Sized>(f: Box<F>, arg: A) -> B {
73147
f(arg)

0 commit comments

Comments
 (0)