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 {
22922292 }
22932293}
22942294
2295- mod dereference;
2296-
22972295mod explicit_type_args {
22982296 struct S1 < T > ( T ) ;
22992297
@@ -2461,6 +2459,9 @@ mod closures {
24612459 }
24622460}
24632461
2462+ mod dereference;
2463+ mod dyn_type;
2464+
24642465fn main ( ) {
24652466 field_access:: f ( ) ; // $ target=f
24662467 method_impl:: f ( ) ; // $ target=f
@@ -2491,5 +2492,6 @@ fn main() {
24912492 dereference:: test ( ) ; // $ target=test
24922493 pattern_matching:: test_all_patterns ( ) ; // $ target=test_all_patterns
24932494 pattern_matching_experimental:: box_patterns ( ) ; // $ target=box_patterns
2494- closures:: f ( ) // $ target=f
2495+ closures:: f ( ) ; // $ target=f
2496+ dyn_type:: test ( ) ; // $ target=test
24952497}
You can’t perform that action at this time.
0 commit comments