Skip to content

Commit 91eb4da

Browse files
committed
Rust: Add a type inference test case resembling PathBuf.canonicalize.
1 parent 8436f00 commit 91eb4da

File tree

2 files changed

+93
-6
lines changed

2 files changed

+93
-6
lines changed

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

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2515,7 +2515,7 @@ pub mod pattern_matching_experimental {
25152515
}
25162516

25172517
pub mod exec {
2518-
// a *greatly* simplified model of `MySqlConnection.execute` in SQLX
2518+
// a highly simplified model of `MySqlConnection.execute` in SQLx
25192519

25202520
trait Connection {}
25212521

@@ -2551,6 +2551,54 @@ pub mod exec {
25512551
}
25522552
}
25532553

2554+
pub mod path_buf {
2555+
// a highly simplified model of `PathBuf::canonicalize`
2556+
2557+
pub struct Path {
2558+
}
2559+
2560+
impl Path {
2561+
pub const fn new() -> Path {
2562+
Path { }
2563+
}
2564+
2565+
pub fn canonicalize(&self) -> Result<PathBuf, ()> {
2566+
Ok(PathBuf::new()) // $ target=new
2567+
}
2568+
}
2569+
2570+
pub struct PathBuf {
2571+
}
2572+
2573+
impl PathBuf {
2574+
pub const fn new() -> PathBuf {
2575+
PathBuf { }
2576+
}
2577+
}
2578+
2579+
// `PathBuf` provides `canonicalize` via `Deref`:
2580+
impl std::ops::Deref for PathBuf {
2581+
type Target = Path;
2582+
2583+
#[inline]
2584+
fn deref(&self) -> &Path {
2585+
// (very much not a real implementation)
2586+
static path : Path = Path::new(); // $ target=new
2587+
&path
2588+
}
2589+
}
2590+
2591+
pub fn f() {
2592+
let path1 = Path::new(); // $ target=new type=path1:Path
2593+
let path2 = path1.canonicalize(); // $ target=canonicalize
2594+
let path3 = path2.unwrap(); // $ target=unwrap type=path3:PathBuf
2595+
2596+
let pathbuf1 = PathBuf::new(); // $ target=new type=pathbuf1:PathBuf
2597+
let pathbuf2 = pathbuf1.canonicalize(); // $ MISSING: target=canonicalize
2598+
let pathbuf3 = pathbuf2.unwrap(); // $ MISSING: target=unwrap type=pathbuf3:PathBuf
2599+
}
2600+
}
2601+
25542602
mod closure;
25552603
mod dereference;
25562604
mod dyn_type;
@@ -2583,6 +2631,7 @@ fn main() {
25832631
method_determined_by_argument_type::f(); // $ target=f
25842632
tuples::f(); // $ target=f
25852633
exec::f(); // $ target=f
2634+
path_buf::f(); // $ target=f
25862635
dereference::test(); // $ target=test
25872636
pattern_matching::test_all_patterns(); // $ target=test_all_patterns
25882637
pattern_matching_experimental::box_patterns(); // $ target=box_patterns

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

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4934,11 +4934,49 @@ inferType
49344934
| main.rs:2550:44:2550:44 | c | | main.rs:2537:5:2537:29 | MySqlConnection |
49354935
| main.rs:2550:47:2550:67 | "SELECT * FROM users" | | file://:0:0:0:0 | & |
49364936
| main.rs:2550:47:2550:67 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str |
4937-
| main.rs:2560:5:2560:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo |
4938-
| main.rs:2561:5:2561:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo |
4939-
| main.rs:2561:20:2561:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo |
4940-
| main.rs:2561:41:2561:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo |
4941-
| main.rs:2577:5:2577:15 | ...::f(...) | | {EXTERNAL LOCATION} | trait Future |
4937+
| main.rs:2561:36:2563:9 | { ... } | | main.rs:2557:5:2558:5 | Path |
4938+
| main.rs:2562:13:2562:20 | Path {...} | | main.rs:2557:5:2558:5 | Path |
4939+
| main.rs:2565:29:2565:33 | SelfParam | | file://:0:0:0:0 | & |
4940+
| main.rs:2565:29:2565:33 | SelfParam | &T | main.rs:2557:5:2558:5 | Path |
4941+
| main.rs:2565:59:2567:9 | { ... } | | {EXTERNAL LOCATION} | Result |
4942+
| main.rs:2565:59:2567:9 | { ... } | E | file://:0:0:0:0 | () |
4943+
| main.rs:2565:59:2567:9 | { ... } | T | main.rs:2570:5:2571:5 | PathBuf |
4944+
| main.rs:2566:13:2566:30 | Ok(...) | | {EXTERNAL LOCATION} | Result |
4945+
| main.rs:2566:13:2566:30 | Ok(...) | E | file://:0:0:0:0 | () |
4946+
| main.rs:2566:13:2566:30 | Ok(...) | T | main.rs:2570:5:2571:5 | PathBuf |
4947+
| main.rs:2566:16:2566:29 | ...::new(...) | | main.rs:2570:5:2571:5 | PathBuf |
4948+
| main.rs:2574:39:2576:9 | { ... } | | main.rs:2570:5:2571:5 | PathBuf |
4949+
| main.rs:2575:13:2575:23 | PathBuf {...} | | main.rs:2570:5:2571:5 | PathBuf |
4950+
| main.rs:2584:18:2584:22 | SelfParam | | file://:0:0:0:0 | & |
4951+
| main.rs:2584:18:2584:22 | SelfParam | &T | main.rs:2570:5:2571:5 | PathBuf |
4952+
| main.rs:2584:34:2588:9 | { ... } | | file://:0:0:0:0 | & |
4953+
| main.rs:2584:34:2588:9 | { ... } | &T | main.rs:2557:5:2558:5 | Path |
4954+
| main.rs:2586:34:2586:44 | ...::new(...) | | main.rs:2557:5:2558:5 | Path |
4955+
| main.rs:2587:13:2587:17 | &path | | file://:0:0:0:0 | & |
4956+
| main.rs:2587:13:2587:17 | &path | &T | main.rs:2557:5:2558:5 | Path |
4957+
| main.rs:2587:14:2587:17 | path | | main.rs:2557:5:2558:5 | Path |
4958+
| main.rs:2592:13:2592:17 | path1 | | main.rs:2557:5:2558:5 | Path |
4959+
| main.rs:2592:21:2592:31 | ...::new(...) | | main.rs:2557:5:2558:5 | Path |
4960+
| main.rs:2593:13:2593:17 | path2 | | {EXTERNAL LOCATION} | Result |
4961+
| main.rs:2593:13:2593:17 | path2 | E | file://:0:0:0:0 | () |
4962+
| main.rs:2593:13:2593:17 | path2 | T | main.rs:2570:5:2571:5 | PathBuf |
4963+
| main.rs:2593:21:2593:25 | path1 | | main.rs:2557:5:2558:5 | Path |
4964+
| main.rs:2593:21:2593:40 | path1.canonicalize() | | {EXTERNAL LOCATION} | Result |
4965+
| main.rs:2593:21:2593:40 | path1.canonicalize() | E | file://:0:0:0:0 | () |
4966+
| main.rs:2593:21:2593:40 | path1.canonicalize() | T | main.rs:2570:5:2571:5 | PathBuf |
4967+
| main.rs:2594:13:2594:17 | path3 | | main.rs:2570:5:2571:5 | PathBuf |
4968+
| main.rs:2594:21:2594:25 | path2 | | {EXTERNAL LOCATION} | Result |
4969+
| main.rs:2594:21:2594:25 | path2 | E | file://:0:0:0:0 | () |
4970+
| main.rs:2594:21:2594:25 | path2 | T | main.rs:2570:5:2571:5 | PathBuf |
4971+
| main.rs:2594:21:2594:34 | path2.unwrap() | | main.rs:2570:5:2571:5 | PathBuf |
4972+
| main.rs:2596:13:2596:20 | pathbuf1 | | main.rs:2570:5:2571:5 | PathBuf |
4973+
| main.rs:2596:24:2596:37 | ...::new(...) | | main.rs:2570:5:2571:5 | PathBuf |
4974+
| main.rs:2597:24:2597:31 | pathbuf1 | | main.rs:2570:5:2571:5 | PathBuf |
4975+
| main.rs:2608:5:2608:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo |
4976+
| main.rs:2609:5:2609:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo |
4977+
| main.rs:2609:20:2609:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo |
4978+
| main.rs:2609:41:2609:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo |
4979+
| main.rs:2625:5:2625:15 | ...::f(...) | | {EXTERNAL LOCATION} | trait Future |
49424980
| pattern_matching.rs:13:26:133:1 | { ... } | | {EXTERNAL LOCATION} | Option |
49434981
| pattern_matching.rs:13:26:133:1 | { ... } | T | file://:0:0:0:0 | () |
49444982
| pattern_matching.rs:14:9:14:13 | value | | {EXTERNAL LOCATION} | Option |

0 commit comments

Comments
 (0)