Skip to content

Commit efaf831

Browse files
committed
Rust: Infer Boolean types for cfg! expressions and patterns
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 2b6b35e8-4f05-4cf7-b229-2ddc3ebdd83c
1 parent 4346178 commit efaf831

3 files changed

Lines changed: 56 additions & 6 deletions

File tree

‎rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3119,6 +3119,10 @@ private module Input3 implements InputSig3 {
31193119
Type inferTypeCertainLanguageSpecific(AstNode n, TypePath path) {
31203120
result = inferLiteralType(n, path, true)
31213121
or
3122+
(n instanceof CfgPredExpr or n instanceof CfgPredPat) and
3123+
path.isEmpty() and
3124+
result instanceof BoolType
3125+
or
31223126
result = inferRefPatType(n) and
31233127
path.isEmpty()
31243128
or

‎rust/ql/test/library-tests/type-inference/cfg.rs‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
pub fn expressions() {
2-
let unix = cfg!(unix); // $ MISSING: certainType=unix:bool
3-
let windows = cfg!(target_os = "windows"); // $ MISSING: certainType=windows:bool
4-
let either = cfg!(any(unix, target_os = "windows")); // $ MISSING: certainType=either:bool
5-
let always = cfg!(all()); // $ MISSING: certainType=always:bool
6-
let never = cfg!(any()); // $ MISSING: certainType=never:bool
2+
let unix = cfg!(unix); // $ certainType=unix:bool
3+
let windows = cfg!(target_os = "windows"); // $ certainType=windows:bool
4+
let either = cfg!(any(unix, target_os = "windows")); // $ certainType=either:bool
5+
let always = cfg!(all()); // $ certainType=always:bool
6+
let never = cfg!(any()); // $ certainType=never:bool
77
}
88

99
pub fn patterns() {
10-
let value = Default::default(); // $ MISSING: target=default type=value:bool
10+
let value = Default::default(); // $ target=default type=value:bool
1111
match value {
1212
cfg!(unix) => (),
1313
cfg!(target_os = "windows") => (),

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,8 +509,29 @@ inferCertainType
509509
| blanket_impl.rs:299:47:299:67 | "SELECT * FROM users" | | {EXTERNAL LOCATION} | & |
510510
| blanket_impl.rs:299:47:299:67 | "SELECT * FROM users" | TRef | {EXTERNAL LOCATION} | str |
511511
| cfg.rs:1:22:7:1 | { ... } | | {EXTERNAL LOCATION} | () |
512+
| cfg.rs:2:9:2:12 | unix | | {EXTERNAL LOCATION} | bool |
513+
| cfg.rs:2:16:2:25 | MacroExpr | | {EXTERNAL LOCATION} | bool |
514+
| cfg.rs:2:20:2:25 | CfgPredExpr | | {EXTERNAL LOCATION} | bool |
515+
| cfg.rs:3:9:3:15 | windows | | {EXTERNAL LOCATION} | bool |
516+
| cfg.rs:3:19:3:45 | MacroExpr | | {EXTERNAL LOCATION} | bool |
517+
| cfg.rs:3:23:3:45 | CfgPredExpr | | {EXTERNAL LOCATION} | bool |
518+
| cfg.rs:4:9:4:14 | either | | {EXTERNAL LOCATION} | bool |
519+
| cfg.rs:4:18:4:55 | MacroExpr | | {EXTERNAL LOCATION} | bool |
520+
| cfg.rs:4:22:4:55 | CfgPredExpr | | {EXTERNAL LOCATION} | bool |
521+
| cfg.rs:5:9:5:14 | always | | {EXTERNAL LOCATION} | bool |
522+
| cfg.rs:5:18:5:28 | MacroExpr | | {EXTERNAL LOCATION} | bool |
523+
| cfg.rs:5:22:5:28 | CfgPredExpr | | {EXTERNAL LOCATION} | bool |
524+
| cfg.rs:6:9:6:13 | never | | {EXTERNAL LOCATION} | bool |
525+
| cfg.rs:6:17:6:27 | MacroExpr | | {EXTERNAL LOCATION} | bool |
526+
| cfg.rs:6:21:6:27 | CfgPredExpr | | {EXTERNAL LOCATION} | bool |
527+
| cfg.rs:12:9:12:18 | MacroPat | | {EXTERNAL LOCATION} | bool |
528+
| cfg.rs:12:13:12:18 | CfgPredPat | | {EXTERNAL LOCATION} | bool |
512529
| cfg.rs:12:23:12:24 | TupleExpr | | {EXTERNAL LOCATION} | () |
530+
| cfg.rs:13:9:13:35 | MacroPat | | {EXTERNAL LOCATION} | bool |
531+
| cfg.rs:13:13:13:35 | CfgPredPat | | {EXTERNAL LOCATION} | bool |
513532
| cfg.rs:13:40:13:41 | TupleExpr | | {EXTERNAL LOCATION} | () |
533+
| cfg.rs:14:9:14:46 | MacroPat | | {EXTERNAL LOCATION} | bool |
534+
| cfg.rs:14:13:14:46 | CfgPredPat | | {EXTERNAL LOCATION} | bool |
514535
| cfg.rs:14:51:14:52 | TupleExpr | | {EXTERNAL LOCATION} | () |
515536
| cfg.rs:15:14:15:15 | TupleExpr | | {EXTERNAL LOCATION} | () |
516537
| closure.rs:4:19:39:5 | { ... } | | {EXTERNAL LOCATION} | () |
@@ -6009,11 +6030,36 @@ inferType
60096030
| blanket_impl.rs:299:47:299:67 | "SELECT * FROM users" | | {EXTERNAL LOCATION} | & |
60106031
| blanket_impl.rs:299:47:299:67 | "SELECT * FROM users" | TRef | {EXTERNAL LOCATION} | str |
60116032
| cfg.rs:1:22:7:1 | { ... } | | {EXTERNAL LOCATION} | () |
6033+
| cfg.rs:2:9:2:12 | unix | | {EXTERNAL LOCATION} | bool |
6034+
| cfg.rs:2:16:2:25 | MacroExpr | | {EXTERNAL LOCATION} | bool |
6035+
| cfg.rs:2:20:2:25 | CfgPredExpr | | {EXTERNAL LOCATION} | bool |
6036+
| cfg.rs:3:9:3:15 | windows | | {EXTERNAL LOCATION} | bool |
6037+
| cfg.rs:3:19:3:45 | MacroExpr | | {EXTERNAL LOCATION} | bool |
6038+
| cfg.rs:3:23:3:45 | CfgPredExpr | | {EXTERNAL LOCATION} | bool |
6039+
| cfg.rs:4:9:4:14 | either | | {EXTERNAL LOCATION} | bool |
6040+
| cfg.rs:4:18:4:55 | MacroExpr | | {EXTERNAL LOCATION} | bool |
6041+
| cfg.rs:4:22:4:55 | CfgPredExpr | | {EXTERNAL LOCATION} | bool |
6042+
| cfg.rs:5:9:5:14 | always | | {EXTERNAL LOCATION} | bool |
6043+
| cfg.rs:5:18:5:28 | MacroExpr | | {EXTERNAL LOCATION} | bool |
6044+
| cfg.rs:5:22:5:28 | CfgPredExpr | | {EXTERNAL LOCATION} | bool |
6045+
| cfg.rs:6:9:6:13 | never | | {EXTERNAL LOCATION} | bool |
6046+
| cfg.rs:6:17:6:27 | MacroExpr | | {EXTERNAL LOCATION} | bool |
6047+
| cfg.rs:6:21:6:27 | CfgPredExpr | | {EXTERNAL LOCATION} | bool |
60126048
| cfg.rs:9:19:17:1 | { ... } | | {EXTERNAL LOCATION} | () |
6049+
| cfg.rs:10:9:10:13 | value | | {EXTERNAL LOCATION} | bool |
6050+
| cfg.rs:10:17:10:34 | ...::default(...) | | {EXTERNAL LOCATION} | bool |
60136051
| cfg.rs:11:5:16:5 | match value { ... } | | {EXTERNAL LOCATION} | () |
6052+
| cfg.rs:11:11:11:15 | value | | {EXTERNAL LOCATION} | bool |
6053+
| cfg.rs:12:9:12:18 | MacroPat | | {EXTERNAL LOCATION} | bool |
6054+
| cfg.rs:12:13:12:18 | CfgPredPat | | {EXTERNAL LOCATION} | bool |
60146055
| cfg.rs:12:23:12:24 | TupleExpr | | {EXTERNAL LOCATION} | () |
6056+
| cfg.rs:13:9:13:35 | MacroPat | | {EXTERNAL LOCATION} | bool |
6057+
| cfg.rs:13:13:13:35 | CfgPredPat | | {EXTERNAL LOCATION} | bool |
60156058
| cfg.rs:13:40:13:41 | TupleExpr | | {EXTERNAL LOCATION} | () |
6059+
| cfg.rs:14:9:14:46 | MacroPat | | {EXTERNAL LOCATION} | bool |
6060+
| cfg.rs:14:13:14:46 | CfgPredPat | | {EXTERNAL LOCATION} | bool |
60166061
| cfg.rs:14:51:14:52 | TupleExpr | | {EXTERNAL LOCATION} | () |
6062+
| cfg.rs:15:9:15:9 | _ | | {EXTERNAL LOCATION} | bool |
60176063
| cfg.rs:15:14:15:15 | TupleExpr | | {EXTERNAL LOCATION} | () |
60186064
| closure.rs:4:19:39:5 | { ... } | | {EXTERNAL LOCATION} | () |
60196065
| closure.rs:6:13:6:22 | my_closure | | {EXTERNAL LOCATION} | dyn Fn |

0 commit comments

Comments
 (0)