File tree Expand file tree Collapse file tree 2 files changed +72
-3
lines changed
rust/ql/test/library-tests/type-inference Expand file tree Collapse file tree 2 files changed +72
-3
lines changed Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change @@ -2265,8 +2265,6 @@ mod loops {
2265
2265
}
2266
2266
}
2267
2267
2268
- mod dereference;
2269
-
2270
2268
mod explicit_type_args {
2271
2269
struct S1 < T > ( T ) ;
2272
2270
@@ -2418,6 +2416,9 @@ mod closures {
2418
2416
}
2419
2417
}
2420
2418
2419
+ mod dereference;
2420
+ mod dyn_type;
2421
+
2421
2422
fn main ( ) {
2422
2423
field_access:: f ( ) ; // $ target=f
2423
2424
method_impl:: f ( ) ; // $ target=f
@@ -2448,5 +2449,6 @@ fn main() {
2448
2449
dereference:: test ( ) ; // $ target=test
2449
2450
pattern_matching:: test_all_patterns ( ) ; // $ target=test_all_patterns
2450
2451
pattern_matching_experimental:: box_patterns ( ) ; // $ target=box_patterns
2451
- closures:: f ( ) // $ target=f
2452
+ closures:: f ( ) ; // $ target=f
2453
+ dyn_type:: test ( ) ; // $ target=test
2452
2454
}
You can’t perform that action at this time.
0 commit comments