Skip to content

Commit 840ef5c

Browse files
committed
Rust: Add test cases for type inference in loops.
1 parent e1b4dea commit 840ef5c

File tree

2 files changed

+232
-5
lines changed

2 files changed

+232
-5
lines changed

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

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1805,6 +1805,94 @@ mod indexers {
18051805
}
18061806
}
18071807

1808+
mod loops {
1809+
struct MyCallable {
1810+
}
1811+
1812+
impl MyCallable {
1813+
fn new() -> Self {
1814+
MyCallable {}
1815+
}
1816+
1817+
fn call(&self) -> i64 {
1818+
1
1819+
}
1820+
}
1821+
1822+
pub fn f() {
1823+
// for loops with arrays
1824+
1825+
for i in [1, 2, 3] { } // $ MISSING: type=i:i32
1826+
for i in [1, 2, 3].map(|x| x + 1) { } // $ MISSING: type=i:i32
1827+
for i in [1, 2, 3].into_iter() { } // $ MISSING: type=i:i32
1828+
1829+
let vals1 = [1u8, 2, 3]; // $ MISSING: type=vals1:[u8; 3]
1830+
for u in vals1 { } // $ MISSING: type=u:u8
1831+
1832+
let vals2 = [1u16; 3]; // $ MISSING: type=vals2:[u16; 3]
1833+
for u in vals2 { } // $ MISSING: type=u:u16
1834+
1835+
let vals3: [u32; 3] = [1, 2, 3]; // $ MISSING: type=vals3:[u32; 3]
1836+
for u in vals3 { } // $ MISSING: type=u:u32
1837+
1838+
let vals4: [u64; 3] = [1; 3]; // $ MISSING: type=vals4:[u64; 3]
1839+
for u in vals4 { } // $ MISSING: type=u:u64
1840+
1841+
let mut strings1 = ["foo", "bar", "baz"]; // $ MISSING: type=strings1:[&str; 3]
1842+
for s in &strings1 { } // $ MISSING: type=s:&str
1843+
for s in &mut strings1 { } // $ MISSING: type=s:&str
1844+
for s in strings1 { } // $ MISSING: type=s:str
1845+
1846+
let strings2 = [String::from("foo"), String::from("bar"), String::from("baz")]; // $ MISSING: type=strings2:[String; 3]
1847+
for s in strings2 { } // $ MISSING: type=s:String
1848+
1849+
let strings3 = &[String::from("foo"), String::from("bar"), String::from("baz")]; // $ MISSING: type=strings3:&[String; 3]
1850+
for s in strings3 { } // $ MISSING: type=s:String
1851+
1852+
let callables = [MyCallable::new(), MyCallable::new(), MyCallable::new()]; // $ MISSING: type=callables:[MyCallable; 3]
1853+
for c in callables { // $ MISSING: type=c:MyCallable
1854+
let result = c.call(); // $ MISSING: type=result:i64 method=call
1855+
}
1856+
1857+
// for loops with ranges
1858+
1859+
for i in 0..10 { } // $ MISSING: type=i:i32
1860+
for u in [0u8 .. 10] { } // $ MISSING: type=u:u8
1861+
1862+
let range1 = std::ops::Range { start: 0u16, end: 10u16 }; // $ MISSING: type=range:std::ops::Range<u16>
1863+
for u in range1 { } // $ MISSING: type=i:u16
1864+
1865+
// for loops with containers
1866+
1867+
let vals3 = vec![1, 2, 3]; // MISSING: type=vals:Vec<i32>
1868+
for i in vals3 { } // $ MISSING: type=i:i32
1869+
1870+
let vals4 : Vec<&u64> = [1u64, 2, 3].iter().collect();
1871+
for u in vals4 { } // $ MISSING: type=u:&u64
1872+
1873+
let matrix1 = vec![vec![1, 2], vec![3, 4]]; // $ MISSING: type=vals5:Vec<Vec<i32>>
1874+
for row in matrix1 { // $ MISSING: type=row:Vec<i32>
1875+
for cell in row { // $ MISSING: type=cell:i32
1876+
}
1877+
}
1878+
1879+
let mut map1 = std::collections::HashMap::new(); // $ MISSING: type=map1:std::collections::HashMap<_, _>
1880+
map1.insert(1, Box::new("one")); // $ method=insert
1881+
map1.insert(2, Box::new("two")); // $ method=insert
1882+
for key in map1.keys() { } // $ method=keys MISSING: type=key:i32
1883+
for value in map1.values() { } // $ method=values MISSING: type=value:Box<&str>
1884+
for (key, value) in map1.iter() { } // $ method=iter MISSING: type=key:i32 type=value:Box<&str>
1885+
for (key, value) in &map1 { } // $ MISSING: type=key:i32 type=value:Box<&str>
1886+
1887+
// while loops
1888+
1889+
let mut a: i64 = 0; // $ type=a:i64
1890+
while a < 10 { // $ method=lt MISSING: type=a:i64m
1891+
a += 1; // $ type=a:i64 method=add_assign
1892+
}
1893+
}
1894+
}
1895+
18081896
fn main() {
18091897
field_access::f();
18101898
method_impl::f();
@@ -1827,4 +1915,5 @@ fn main() {
18271915
async_::f();
18281916
impl_trait::f();
18291917
indexers::f();
1918+
loops::f();
18301919
}

rust/ql/test/library-tests/type-inference/type-inference.expected

Lines changed: 143 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2610,9 +2610,147 @@ inferType
26102610
| main.rs:1804:24:1804:25 | xs | | file://:0:0:0:0 | [] |
26112611
| main.rs:1804:24:1804:25 | xs | [T;...] | main.rs:1759:5:1760:13 | S |
26122612
| main.rs:1804:24:1804:25 | xs | [T] | main.rs:1759:5:1760:13 | S |
2613-
| main.rs:1810:5:1810:20 | ...::f(...) | | main.rs:67:5:67:21 | Foo |
2614-
| main.rs:1811:5:1811:60 | ...::g(...) | | main.rs:67:5:67:21 | Foo |
2615-
| main.rs:1811:20:1811:38 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
2616-
| main.rs:1811:41:1811:59 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
2617-
| main.rs:1827:5:1827:15 | ...::f(...) | | {EXTERNAL LOCATION} | trait Future |
2613+
| main.rs:1813:26:1815:9 | { ... } | | main.rs:1809:5:1810:5 | MyCallable |
2614+
| main.rs:1814:13:1814:25 | MyCallable {...} | | main.rs:1809:5:1810:5 | MyCallable |
2615+
| main.rs:1817:17:1817:21 | SelfParam | | file://:0:0:0:0 | & |
2616+
| main.rs:1817:17:1817:21 | SelfParam | &T | main.rs:1809:5:1810:5 | MyCallable |
2617+
| main.rs:1817:31:1819:9 | { ... } | | {EXTERNAL LOCATION} | i32 |
2618+
| main.rs:1817:31:1819:9 | { ... } | | {EXTERNAL LOCATION} | i64 |
2619+
| main.rs:1818:13:1818:13 | 1 | | {EXTERNAL LOCATION} | i32 |
2620+
| main.rs:1818:13:1818:13 | 1 | | {EXTERNAL LOCATION} | i64 |
2621+
| main.rs:1825:19:1825:19 | 1 | | {EXTERNAL LOCATION} | i32 |
2622+
| main.rs:1825:22:1825:22 | 2 | | {EXTERNAL LOCATION} | i32 |
2623+
| main.rs:1825:25:1825:25 | 3 | | {EXTERNAL LOCATION} | i32 |
2624+
| main.rs:1826:19:1826:19 | 1 | | {EXTERNAL LOCATION} | i32 |
2625+
| main.rs:1826:22:1826:22 | 2 | | {EXTERNAL LOCATION} | i32 |
2626+
| main.rs:1826:25:1826:25 | 3 | | {EXTERNAL LOCATION} | i32 |
2627+
| main.rs:1826:40:1826:40 | 1 | | {EXTERNAL LOCATION} | i32 |
2628+
| main.rs:1827:19:1827:19 | 1 | | {EXTERNAL LOCATION} | i32 |
2629+
| main.rs:1827:22:1827:22 | 2 | | {EXTERNAL LOCATION} | i32 |
2630+
| main.rs:1827:25:1827:25 | 3 | | {EXTERNAL LOCATION} | i32 |
2631+
| main.rs:1829:22:1829:24 | 1u8 | | {EXTERNAL LOCATION} | u8 |
2632+
| main.rs:1829:27:1829:27 | 2 | | {EXTERNAL LOCATION} | i32 |
2633+
| main.rs:1829:30:1829:30 | 3 | | {EXTERNAL LOCATION} | i32 |
2634+
| main.rs:1832:22:1832:25 | 1u16 | | {EXTERNAL LOCATION} | u16 |
2635+
| main.rs:1832:28:1832:28 | 3 | | {EXTERNAL LOCATION} | i32 |
2636+
| main.rs:1835:13:1835:17 | vals3 | | file://:0:0:0:0 | [] |
2637+
| main.rs:1835:13:1835:17 | vals3 | [T;...] | {EXTERNAL LOCATION} | u32 |
2638+
| main.rs:1835:26:1835:26 | 3 | | {EXTERNAL LOCATION} | i32 |
2639+
| main.rs:1835:31:1835:39 | [...] | | file://:0:0:0:0 | [] |
2640+
| main.rs:1835:31:1835:39 | [...] | [T;...] | {EXTERNAL LOCATION} | u32 |
2641+
| main.rs:1835:32:1835:32 | 1 | | {EXTERNAL LOCATION} | i32 |
2642+
| main.rs:1835:35:1835:35 | 2 | | {EXTERNAL LOCATION} | i32 |
2643+
| main.rs:1835:38:1835:38 | 3 | | {EXTERNAL LOCATION} | i32 |
2644+
| main.rs:1836:18:1836:22 | vals3 | | file://:0:0:0:0 | [] |
2645+
| main.rs:1836:18:1836:22 | vals3 | [T;...] | {EXTERNAL LOCATION} | u32 |
2646+
| main.rs:1838:13:1838:17 | vals4 | | file://:0:0:0:0 | [] |
2647+
| main.rs:1838:13:1838:17 | vals4 | [T;...] | {EXTERNAL LOCATION} | u64 |
2648+
| main.rs:1838:26:1838:26 | 3 | | {EXTERNAL LOCATION} | i32 |
2649+
| main.rs:1838:31:1838:36 | [1; 3] | | file://:0:0:0:0 | [] |
2650+
| main.rs:1838:31:1838:36 | [1; 3] | [T;...] | {EXTERNAL LOCATION} | u64 |
2651+
| main.rs:1838:32:1838:32 | 1 | | {EXTERNAL LOCATION} | i32 |
2652+
| main.rs:1838:35:1838:35 | 3 | | {EXTERNAL LOCATION} | i32 |
2653+
| main.rs:1839:18:1839:22 | vals4 | | file://:0:0:0:0 | [] |
2654+
| main.rs:1839:18:1839:22 | vals4 | [T;...] | {EXTERNAL LOCATION} | u64 |
2655+
| main.rs:1841:29:1841:33 | "foo" | | {EXTERNAL LOCATION} | str |
2656+
| main.rs:1841:36:1841:40 | "bar" | | {EXTERNAL LOCATION} | str |
2657+
| main.rs:1841:43:1841:47 | "baz" | | {EXTERNAL LOCATION} | str |
2658+
| main.rs:1842:18:1842:26 | &strings1 | | file://:0:0:0:0 | & |
2659+
| main.rs:1843:18:1843:30 | &mut strings1 | | file://:0:0:0:0 | & |
2660+
| main.rs:1846:25:1846:43 | ...::from(...) | | {EXTERNAL LOCATION} | String |
2661+
| main.rs:1846:38:1846:42 | "foo" | | {EXTERNAL LOCATION} | str |
2662+
| main.rs:1846:46:1846:64 | ...::from(...) | | {EXTERNAL LOCATION} | String |
2663+
| main.rs:1846:59:1846:63 | "bar" | | {EXTERNAL LOCATION} | str |
2664+
| main.rs:1846:67:1846:85 | ...::from(...) | | {EXTERNAL LOCATION} | String |
2665+
| main.rs:1846:80:1846:84 | "baz" | | {EXTERNAL LOCATION} | str |
2666+
| main.rs:1849:13:1849:20 | strings3 | | file://:0:0:0:0 | & |
2667+
| main.rs:1849:24:1849:87 | &... | | file://:0:0:0:0 | & |
2668+
| main.rs:1849:26:1849:44 | ...::from(...) | | {EXTERNAL LOCATION} | String |
2669+
| main.rs:1849:39:1849:43 | "foo" | | {EXTERNAL LOCATION} | str |
2670+
| main.rs:1849:47:1849:65 | ...::from(...) | | {EXTERNAL LOCATION} | String |
2671+
| main.rs:1849:60:1849:64 | "bar" | | {EXTERNAL LOCATION} | str |
2672+
| main.rs:1849:68:1849:86 | ...::from(...) | | {EXTERNAL LOCATION} | String |
2673+
| main.rs:1849:81:1849:85 | "baz" | | {EXTERNAL LOCATION} | str |
2674+
| main.rs:1850:18:1850:25 | strings3 | | file://:0:0:0:0 | & |
2675+
| main.rs:1852:26:1852:42 | ...::new(...) | | main.rs:1809:5:1810:5 | MyCallable |
2676+
| main.rs:1852:45:1852:61 | ...::new(...) | | main.rs:1809:5:1810:5 | MyCallable |
2677+
| main.rs:1852:64:1852:80 | ...::new(...) | | main.rs:1809:5:1810:5 | MyCallable |
2678+
| main.rs:1859:18:1859:18 | 0 | | {EXTERNAL LOCATION} | i32 |
2679+
| main.rs:1859:21:1859:22 | 10 | | {EXTERNAL LOCATION} | i32 |
2680+
| main.rs:1860:19:1860:21 | 0u8 | | {EXTERNAL LOCATION} | u8 |
2681+
| main.rs:1860:26:1860:27 | 10 | | {EXTERNAL LOCATION} | i32 |
2682+
| main.rs:1862:13:1862:18 | range1 | | {EXTERNAL LOCATION} | Range |
2683+
| main.rs:1862:13:1862:18 | range1 | Idx | {EXTERNAL LOCATION} | u16 |
2684+
| main.rs:1862:22:1862:64 | ...::Range {...} | | {EXTERNAL LOCATION} | Range |
2685+
| main.rs:1862:22:1862:64 | ...::Range {...} | Idx | {EXTERNAL LOCATION} | u16 |
2686+
| main.rs:1862:47:1862:50 | 0u16 | | {EXTERNAL LOCATION} | u16 |
2687+
| main.rs:1862:58:1862:62 | 10u16 | | {EXTERNAL LOCATION} | u16 |
2688+
| main.rs:1863:18:1863:23 | range1 | | {EXTERNAL LOCATION} | Range |
2689+
| main.rs:1863:18:1863:23 | range1 | Idx | {EXTERNAL LOCATION} | u16 |
2690+
| main.rs:1867:26:1867:26 | 1 | | {EXTERNAL LOCATION} | i32 |
2691+
| main.rs:1867:29:1867:29 | 2 | | {EXTERNAL LOCATION} | i32 |
2692+
| main.rs:1867:32:1867:32 | 3 | | {EXTERNAL LOCATION} | i32 |
2693+
| main.rs:1870:13:1870:17 | vals4 | | {EXTERNAL LOCATION} | Vec |
2694+
| main.rs:1870:13:1870:17 | vals4 | T | file://:0:0:0:0 | & |
2695+
| main.rs:1870:13:1870:17 | vals4 | T.&T | {EXTERNAL LOCATION} | u64 |
2696+
| main.rs:1870:33:1870:61 | ... .collect() | | {EXTERNAL LOCATION} | Vec |
2697+
| main.rs:1870:33:1870:61 | ... .collect() | T | file://:0:0:0:0 | & |
2698+
| main.rs:1870:33:1870:61 | ... .collect() | T.&T | {EXTERNAL LOCATION} | u64 |
2699+
| main.rs:1870:34:1870:37 | 1u64 | | {EXTERNAL LOCATION} | u64 |
2700+
| main.rs:1870:40:1870:40 | 2 | | {EXTERNAL LOCATION} | i32 |
2701+
| main.rs:1870:43:1870:43 | 3 | | {EXTERNAL LOCATION} | i32 |
2702+
| main.rs:1871:18:1871:22 | vals4 | | {EXTERNAL LOCATION} | Vec |
2703+
| main.rs:1871:18:1871:22 | vals4 | T | file://:0:0:0:0 | & |
2704+
| main.rs:1871:18:1871:22 | vals4 | T.&T | {EXTERNAL LOCATION} | u64 |
2705+
| main.rs:1873:33:1873:33 | 1 | | {EXTERNAL LOCATION} | i32 |
2706+
| main.rs:1873:36:1873:36 | 2 | | {EXTERNAL LOCATION} | i32 |
2707+
| main.rs:1873:45:1873:45 | 3 | | {EXTERNAL LOCATION} | i32 |
2708+
| main.rs:1873:48:1873:48 | 4 | | {EXTERNAL LOCATION} | i32 |
2709+
| main.rs:1879:13:1879:20 | mut map1 | | {EXTERNAL LOCATION} | HashMap |
2710+
| main.rs:1879:13:1879:20 | mut map1 | S | {EXTERNAL LOCATION} | RandomState |
2711+
| main.rs:1879:24:1879:55 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap |
2712+
| main.rs:1879:24:1879:55 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState |
2713+
| main.rs:1880:9:1880:12 | map1 | | {EXTERNAL LOCATION} | HashMap |
2714+
| main.rs:1880:9:1880:12 | map1 | S | {EXTERNAL LOCATION} | RandomState |
2715+
| main.rs:1880:9:1880:39 | map1.insert(...) | | {EXTERNAL LOCATION} | Option |
2716+
| main.rs:1880:21:1880:21 | 1 | | {EXTERNAL LOCATION} | i32 |
2717+
| main.rs:1880:24:1880:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box |
2718+
| main.rs:1880:33:1880:37 | "one" | | {EXTERNAL LOCATION} | str |
2719+
| main.rs:1881:9:1881:12 | map1 | | {EXTERNAL LOCATION} | HashMap |
2720+
| main.rs:1881:9:1881:12 | map1 | S | {EXTERNAL LOCATION} | RandomState |
2721+
| main.rs:1881:9:1881:39 | map1.insert(...) | | {EXTERNAL LOCATION} | Option |
2722+
| main.rs:1881:21:1881:21 | 2 | | {EXTERNAL LOCATION} | i32 |
2723+
| main.rs:1881:24:1881:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box |
2724+
| main.rs:1881:33:1881:37 | "two" | | {EXTERNAL LOCATION} | str |
2725+
| main.rs:1882:20:1882:23 | map1 | | {EXTERNAL LOCATION} | HashMap |
2726+
| main.rs:1882:20:1882:23 | map1 | S | {EXTERNAL LOCATION} | RandomState |
2727+
| main.rs:1882:20:1882:30 | map1.keys() | | {EXTERNAL LOCATION} | Keys |
2728+
| main.rs:1883:22:1883:25 | map1 | | {EXTERNAL LOCATION} | HashMap |
2729+
| main.rs:1883:22:1883:25 | map1 | S | {EXTERNAL LOCATION} | RandomState |
2730+
| main.rs:1883:22:1883:34 | map1.values() | | {EXTERNAL LOCATION} | Values |
2731+
| main.rs:1884:29:1884:32 | map1 | | {EXTERNAL LOCATION} | HashMap |
2732+
| main.rs:1884:29:1884:32 | map1 | S | {EXTERNAL LOCATION} | RandomState |
2733+
| main.rs:1884:29:1884:39 | map1.iter() | | {EXTERNAL LOCATION} | Iter |
2734+
| main.rs:1885:29:1885:33 | &map1 | | file://:0:0:0:0 | & |
2735+
| main.rs:1885:29:1885:33 | &map1 | &T | {EXTERNAL LOCATION} | HashMap |
2736+
| main.rs:1885:29:1885:33 | &map1 | &T.S | {EXTERNAL LOCATION} | RandomState |
2737+
| main.rs:1885:30:1885:33 | map1 | | {EXTERNAL LOCATION} | HashMap |
2738+
| main.rs:1885:30:1885:33 | map1 | S | {EXTERNAL LOCATION} | RandomState |
2739+
| main.rs:1889:13:1889:17 | mut a | | {EXTERNAL LOCATION} | i32 |
2740+
| main.rs:1889:13:1889:17 | mut a | | {EXTERNAL LOCATION} | i64 |
2741+
| main.rs:1889:26:1889:26 | 0 | | {EXTERNAL LOCATION} | i32 |
2742+
| main.rs:1889:26:1889:26 | 0 | | {EXTERNAL LOCATION} | i64 |
2743+
| main.rs:1890:15:1890:15 | a | | {EXTERNAL LOCATION} | i32 |
2744+
| main.rs:1890:15:1890:15 | a | | {EXTERNAL LOCATION} | i64 |
2745+
| main.rs:1890:15:1890:20 | ... < ... | | {EXTERNAL LOCATION} | bool |
2746+
| main.rs:1890:19:1890:20 | 10 | | {EXTERNAL LOCATION} | i32 |
2747+
| main.rs:1891:13:1891:13 | a | | {EXTERNAL LOCATION} | i32 |
2748+
| main.rs:1891:13:1891:13 | a | | {EXTERNAL LOCATION} | i64 |
2749+
| main.rs:1891:13:1891:18 | ... += ... | | file://:0:0:0:0 | () |
2750+
| main.rs:1891:18:1891:18 | 1 | | {EXTERNAL LOCATION} | i32 |
2751+
| main.rs:1898:5:1898:20 | ...::f(...) | | main.rs:67:5:67:21 | Foo |
2752+
| main.rs:1899:5:1899:60 | ...::g(...) | | main.rs:67:5:67:21 | Foo |
2753+
| main.rs:1899:20:1899:38 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
2754+
| main.rs:1899:41:1899:59 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
2755+
| main.rs:1915:5:1915:15 | ...::f(...) | | {EXTERNAL LOCATION} | trait Future |
26182756
testFailures

0 commit comments

Comments
 (0)