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 @@ -2292,8 +2292,6 @@ mod loops {
2292
2292
}
2293
2293
}
2294
2294
2295
- mod dereference;
2296
-
2297
2295
mod explicit_type_args {
2298
2296
struct S1 < T > ( T ) ;
2299
2297
@@ -2461,6 +2459,9 @@ mod closures {
2461
2459
}
2462
2460
}
2463
2461
2462
+ mod dereference;
2463
+ mod dyn_type;
2464
+
2464
2465
fn main ( ) {
2465
2466
field_access:: f ( ) ; // $ target=f
2466
2467
method_impl:: f ( ) ; // $ target=f
@@ -2491,5 +2492,6 @@ fn main() {
2491
2492
dereference:: test ( ) ; // $ target=test
2492
2493
pattern_matching:: test_all_patterns ( ) ; // $ target=test_all_patterns
2493
2494
pattern_matching_experimental:: box_patterns ( ) ; // $ target=box_patterns
2494
- closures:: f ( ) // $ target=f
2495
+ closures:: f ( ) ; // $ target=f
2496
+ dyn_type:: test ( ) ; // $ target=test
2495
2497
}
You can’t perform that action at this time.
0 commit comments