From 838f3b90e714b908cafdc43f3884fdc28747b2f7 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 5 Mar 2026 20:49:58 +0100 Subject: [PATCH] Rust: Add type inference test --- .../type-inference/regressions.rs | 42 ++++++++++++++++ .../type-inference/type-inference.expected | 48 +++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/rust/ql/test/library-tests/type-inference/regressions.rs b/rust/ql/test/library-tests/type-inference/regressions.rs index 17475d50166..17a3d121c32 100644 --- a/rust/ql/test/library-tests/type-inference/regressions.rs +++ b/rust/ql/test/library-tests/type-inference/regressions.rs @@ -32,3 +32,45 @@ mod regression1 { opt_e.unwrap() // $ target=unwrap } } + +mod regression2 { + use std::ops::Sub; + + #[derive(Copy, Clone)] + struct S1; + #[derive(Copy, Clone)] + struct S2; + + impl Sub for S1 { + type Output = Self; + + // S1SubS1 + fn sub(self, _rhs: Self) -> Self::Output { + S1 + } + } + + impl Sub for S1 { + type Output = S2; + + // S1SubS2 + fn sub(self, _rhs: S2) -> Self::Output { + S2 + } + } + + impl Sub<&S2> for S1 { + type Output = >::Output; + + // S1SubRefS2 + fn sub(self, other: &S2) -> >::Output { + Sub::sub(self, *other) // $ target=S1SubS2 target=deref + } + } + + fn foo() { + let s1 = S1; + let s2 = S2; + let x = s1 - &s2; // $ target=S1SubRefS2 type=x:S2 $ SPURIOUS: type=x:S1 + } +} diff --git a/rust/ql/test/library-tests/type-inference/type-inference.expected b/rust/ql/test/library-tests/type-inference/type-inference.expected index 5d0b167074a..fb302784b64 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.expected +++ b/rust/ql/test/library-tests/type-inference/type-inference.expected @@ -4947,6 +4947,22 @@ inferCertainType | regressions.rs:27:37:27:41 | vec_e | | {EXTERNAL LOCATION} | Vec | | regressions.rs:27:37:27:41 | vec_e | A | {EXTERNAL LOCATION} | Global | | regressions.rs:28:9:30:9 | { ... } | | {EXTERNAL LOCATION} | () | +| regressions.rs:48:16:48:19 | SelfParam | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:48:22:48:25 | _rhs | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:48:50:50:9 | { ... } | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:57:16:57:19 | SelfParam | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:57:22:57:25 | _rhs | | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:57:48:59:9 | { ... } | | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:66:16:66:19 | SelfParam | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:66:22:66:26 | other | | {EXTERNAL LOCATION} | & | +| regressions.rs:66:22:66:26 | other | TRef | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:66:61:68:9 | { ... } | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:66:61:68:9 | { ... } | | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:67:22:67:25 | self | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:67:29:67:33 | other | | {EXTERNAL LOCATION} | & | +| regressions.rs:67:29:67:33 | other | TRef | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:71:14:75:5 | { ... } | | {EXTERNAL LOCATION} | () | +| regressions.rs:74:22:74:24 | &s2 | | {EXTERNAL LOCATION} | & | inferType | associated_types.rs:5:15:5:18 | SelfParam | | associated_types.rs:1:1:2:21 | Wrapper | | associated_types.rs:5:15:5:18 | SelfParam | A | associated_types.rs:4:6:4:6 | A | @@ -14789,4 +14805,36 @@ inferType | regressions.rs:32:9:32:13 | opt_e | | {EXTERNAL LOCATION} | Option | | regressions.rs:32:9:32:13 | opt_e | T | regressions.rs:5:5:7:5 | E | | regressions.rs:32:9:32:22 | opt_e.unwrap() | | regressions.rs:5:5:7:5 | E | +| regressions.rs:48:16:48:19 | SelfParam | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:48:22:48:25 | _rhs | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:48:50:50:9 | { ... } | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:49:13:49:14 | S1 | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:57:16:57:19 | SelfParam | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:57:22:57:25 | _rhs | | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:57:48:59:9 | { ... } | | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:58:13:58:14 | S2 | | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:66:16:66:19 | SelfParam | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:66:22:66:26 | other | | {EXTERNAL LOCATION} | & | +| regressions.rs:66:22:66:26 | other | TRef | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:66:61:68:9 | { ... } | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:66:61:68:9 | { ... } | | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:67:13:67:34 | ...::sub(...) | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:67:13:67:34 | ...::sub(...) | | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:67:22:67:25 | self | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:67:28:67:33 | * ... | | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:67:29:67:33 | other | | {EXTERNAL LOCATION} | & | +| regressions.rs:67:29:67:33 | other | TRef | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:71:14:75:5 | { ... } | | {EXTERNAL LOCATION} | () | +| regressions.rs:72:13:72:14 | s1 | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:72:18:72:19 | S1 | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:73:13:73:14 | s2 | | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:73:18:73:19 | S2 | | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:74:13:74:13 | x | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:74:13:74:13 | x | | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:74:17:74:18 | s1 | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:74:17:74:24 | ... - ... | | regressions.rs:39:5:40:14 | S1 | +| regressions.rs:74:17:74:24 | ... - ... | | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:74:22:74:24 | &s2 | | {EXTERNAL LOCATION} | & | +| regressions.rs:74:22:74:24 | &s2 | TRef | regressions.rs:41:5:42:14 | S2 | +| regressions.rs:74:23:74:24 | s2 | | regressions.rs:41:5:42:14 | S2 | testFailures