Skip to content

Commit 9592185

Browse files
committed
Rust: Add type inference tests for dyn types
1 parent 1485d70 commit 9592185

File tree

2 files changed

+72
-3
lines changed

2 files changed

+72
-3
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// Test cases for type inference and method resolution with `dyn` types
2+
3+
use std::fmt::Debug;
4+
5+
trait MyTrait1 {
6+
// MyTrait1::m
7+
fn m(&self) -> String;
8+
}
9+
10+
trait GenericGet<A> {
11+
// GenericGet::get
12+
fn get(&self) -> A;
13+
}
14+
15+
#[derive(Clone, Debug)]
16+
struct MyStruct {
17+
value: i32,
18+
}
19+
20+
impl MyTrait1 for MyStruct {
21+
// MyStruct1::m
22+
fn m(&self) -> String {
23+
format!("MyTrait1: {}", self.value) // $ fieldof=MyStruct
24+
}
25+
}
26+
27+
#[derive(Clone, Debug)]
28+
struct GenStruct<A: Clone + Debug> {
29+
value: A,
30+
}
31+
32+
impl<A: Clone + Debug> GenericGet<A> for GenStruct<A> {
33+
// GenStruct<A>::get
34+
fn get(&self) -> A {
35+
self.value.clone() // $ fieldof=GenStruct target=clone
36+
}
37+
}
38+
39+
fn get_a<A, G: GenericGet<A> + ?Sized>(a: &G) -> A {
40+
a.get() // $ target=GenericGet::get
41+
}
42+
43+
fn get_box_trait<A: Clone + Debug + 'static>(a: A) -> Box<dyn GenericGet<A>> {
44+
Box::new(GenStruct { value: a }) // $ target=new
45+
}
46+
47+
fn test_basic_dyn_trait(obj: &dyn MyTrait1) {
48+
let _result = (*obj).m(); // $ target=deref MISSING: target=MyTrait1::m type=_result:String
49+
}
50+
51+
fn test_generic_dyn_trait(obj: &dyn GenericGet<String>) {
52+
let _result1 = (*obj).get(); // $ target=deref MISSING: target=GenericGet::get type=_result1:String
53+
let _result2 = get_a(obj); // $ target=get_a MISSING: type=_result2:String
54+
}
55+
56+
fn test_poly_dyn_trait() {
57+
let obj = get_box_trait(true); // $ target=get_box_trait
58+
let _result = (*obj).get(); // $ target=deref MISSING: target=GenericGet::get type=_result:bool
59+
}
60+
61+
pub fn test() {
62+
test_basic_dyn_trait(&MyStruct { value: 42 }); // $ target=test_basic_dyn_trait
63+
test_generic_dyn_trait(&GenStruct {
64+
value: "".to_string(),
65+
}); // $ target=test_generic_dyn_trait
66+
test_poly_dyn_trait(); // $ target=test_poly_dyn_trait
67+
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2265,8 +2265,6 @@ mod loops {
22652265
}
22662266
}
22672267

2268-
mod dereference;
2269-
22702268
mod explicit_type_args {
22712269
struct S1<T>(T);
22722270

@@ -2418,6 +2416,9 @@ mod closures {
24182416
}
24192417
}
24202418

2419+
mod dereference;
2420+
mod dyn_type;
2421+
24212422
fn main() {
24222423
field_access::f(); // $ target=f
24232424
method_impl::f(); // $ target=f
@@ -2448,5 +2449,6 @@ fn main() {
24482449
dereference::test(); // $ target=test
24492450
pattern_matching::test_all_patterns(); // $ target=test_all_patterns
24502451
pattern_matching_experimental::box_patterns(); // $ target=box_patterns
2451-
closures::f() // $ target=f
2452+
closures::f(); // $ target=f
2453+
dyn_type::test(); // $ target=test
24522454
}

0 commit comments

Comments
 (0)