diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll b/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll index 471afaa920ea..6c0c257767a7 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll @@ -296,8 +296,14 @@ class ItemTree extends LeafTree, Item { } // `LetExpr` is a pre-order tree such that the pattern itself ends up // dominating successors in the graph in the same way that patterns do in // `match` expressions. -class LetExprTree extends StandardPreOrderTree instanceof LetExpr { - override AstNode getChildNode(int i) { i = 0 and result = super.getPat() } +class LetExprTree extends StandardPreOrderTree, LetExpr { + override AstNode getChildNode(int i) { + i = 0 and + result = this.getExpr() + or + i = 1 and + result = this.getPat() + } } class LetStmtTree extends PreOrderTree, LetStmt { @@ -479,10 +485,12 @@ class MatchExprTree extends PostOrderTree instanceof MatchExpr { } } -class MethodCallExprTree extends StandardPostOrderTree instanceof MethodCallExpr { +class MethodCallExprTree extends StandardPostOrderTree, MethodCallExpr { override AstNode getChildNode(int i) { - result = super.getReceiver() and - result = super.getArgList().getArg(i + 1) + i = 0 and + result = this.getReceiver() + or + result = this.getArgList().getArg(i + 1) } } diff --git a/rust/ql/test/library-tests/controlflow/Cfg.expected b/rust/ql/test/library-tests/controlflow/Cfg.expected index faf3c586280d..5083c873ad09 100644 --- a/rust/ql/test/library-tests/controlflow/Cfg.expected +++ b/rust/ql/test/library-tests/controlflow/Cfg.expected @@ -157,10 +157,12 @@ edges | test.rs:80:24:80:28 | RangeExpr | test.rs:80:13:80:20 | iter | | | test.rs:80:27:80:28 | 10 | test.rs:80:24:80:28 | RangeExpr | | | test.rs:81:9:85:9 | WhileExpr | test.rs:79:25:86:5 | BlockExpr | | -| test.rs:81:15:81:39 | LetExpr | test.rs:81:19:81:25 | TupleStructPat | | +| test.rs:81:15:81:39 | LetExpr | test.rs:81:29:81:32 | iter | | | test.rs:81:19:81:25 | TupleStructPat | test.rs:81:9:85:9 | WhileExpr | no-match | | test.rs:81:19:81:25 | TupleStructPat | test.rs:81:24:81:24 | x | match | | test.rs:81:24:81:24 | x | test.rs:82:17:82:17 | PathExpr | match | +| test.rs:81:29:81:32 | iter | test.rs:81:29:81:39 | MethodCallExpr | | +| test.rs:81:29:81:39 | MethodCallExpr | test.rs:81:19:81:25 | TupleStructPat | | | test.rs:81:41:85:9 | BlockExpr | test.rs:81:15:81:39 | LetExpr | | | test.rs:82:13:84:13 | IfExpr | test.rs:81:41:85:9 | BlockExpr | | | test.rs:82:17:82:17 | PathExpr | test.rs:82:21:82:21 | 5 | | @@ -233,10 +235,11 @@ edges | test.rs:113:25:113:38 | Param | test.rs:114:12:114:26 | LetExpr | | | test.rs:113:48:119:5 | BlockExpr | test.rs:113:5:119:5 | exit test_if_let_else (normal) | | | test.rs:114:9:118:9 | IfExpr | test.rs:113:48:119:5 | BlockExpr | | -| test.rs:114:12:114:26 | LetExpr | test.rs:114:16:114:22 | TupleStructPat | | +| test.rs:114:12:114:26 | LetExpr | test.rs:114:26:114:26 | a | | | test.rs:114:16:114:22 | TupleStructPat | test.rs:114:21:114:21 | n | match | | test.rs:114:16:114:22 | TupleStructPat | test.rs:117:13:117:13 | 0 | no-match | | test.rs:114:21:114:21 | n | test.rs:115:13:115:13 | n | match | +| test.rs:114:26:114:26 | a | test.rs:114:16:114:22 | TupleStructPat | | | test.rs:114:28:116:9 | BlockExpr | test.rs:114:9:118:9 | IfExpr | | | test.rs:115:13:115:13 | n | test.rs:114:28:116:9 | BlockExpr | | | test.rs:116:16:118:9 | BlockExpr | test.rs:114:9:118:9 | IfExpr | | @@ -248,10 +251,11 @@ edges | test.rs:121:43:126:5 | BlockExpr | test.rs:121:5:126:5 | exit test_if_let (normal) | | | test.rs:122:9:124:9 | ExprStmt | test.rs:122:12:122:26 | LetExpr | | | test.rs:122:9:124:9 | IfExpr | test.rs:125:9:125:9 | 0 | | -| test.rs:122:12:122:26 | LetExpr | test.rs:122:16:122:22 | TupleStructPat | | +| test.rs:122:12:122:26 | LetExpr | test.rs:122:26:122:26 | a | | | test.rs:122:16:122:22 | TupleStructPat | test.rs:122:9:124:9 | IfExpr | no-match | | test.rs:122:16:122:22 | TupleStructPat | test.rs:122:21:122:21 | n | match | | test.rs:122:21:122:21 | n | test.rs:123:13:123:13 | n | match | +| test.rs:122:26:122:26 | a | test.rs:122:16:122:22 | TupleStructPat | | | test.rs:122:28:124:9 | BlockExpr | test.rs:122:9:124:9 | IfExpr | | | test.rs:123:13:123:13 | n | test.rs:122:28:124:9 | BlockExpr | | | test.rs:125:9:125:9 | 0 | test.rs:121:43:126:5 | BlockExpr | | diff --git a/rust/ql/test/library-tests/variables/Cfg.expected b/rust/ql/test/library-tests/variables/Cfg.expected index db01e6c6e7f8..771d68b602d2 100644 --- a/rust/ql/test/library-tests/variables/Cfg.expected +++ b/rust/ql/test/library-tests/variables/Cfg.expected @@ -149,10 +149,11 @@ edges | variables.rs:74:19:74:40 | CallExpr | variables.rs:74:14:74:41 | CallExpr | | | variables.rs:74:32:74:39 | "Hello!" | variables.rs:74:19:74:40 | CallExpr | | | variables.rs:76:5:79:5 | IfExpr | variables.rs:73:19:80:1 | BlockExpr | | -| variables.rs:76:8:77:12 | LetExpr | variables.rs:76:12:76:23 | TupleStructPat | | +| variables.rs:76:8:77:12 | LetExpr | variables.rs:77:11:77:12 | s1 | | | variables.rs:76:12:76:23 | TupleStructPat | variables.rs:76:5:79:5 | IfExpr | no-match | | variables.rs:76:12:76:23 | TupleStructPat | variables.rs:76:17:76:22 | s2 | match | | variables.rs:76:17:76:22 | s2 | variables.rs:78:9:78:22 | ExprStmt | match | +| variables.rs:77:11:77:12 | s1 | variables.rs:76:12:76:23 | TupleStructPat | | | variables.rs:77:14:79:5 | BlockExpr | variables.rs:76:5:79:5 | IfExpr | | | variables.rs:78:9:78:17 | PathExpr | variables.rs:78:19:78:20 | s2 | | | variables.rs:78:9:78:21 | CallExpr | variables.rs:77:14:79:5 | BlockExpr | | @@ -184,10 +185,11 @@ edges | variables.rs:91:19:91:40 | CallExpr | variables.rs:91:14:91:41 | CallExpr | | | variables.rs:91:32:91:39 | "Hello!" | variables.rs:91:19:91:40 | CallExpr | | | variables.rs:93:5:96:5 | WhileExpr | variables.rs:90:19:97:1 | BlockExpr | | -| variables.rs:93:11:94:12 | LetExpr | variables.rs:93:15:93:26 | TupleStructPat | | +| variables.rs:93:11:94:12 | LetExpr | variables.rs:94:11:94:12 | s1 | | | variables.rs:93:15:93:26 | TupleStructPat | variables.rs:93:5:96:5 | WhileExpr | no-match | | variables.rs:93:15:93:26 | TupleStructPat | variables.rs:93:20:93:25 | s2 | match | | variables.rs:93:20:93:25 | s2 | variables.rs:95:9:95:22 | ExprStmt | match | +| variables.rs:94:11:94:12 | s1 | variables.rs:93:15:93:26 | TupleStructPat | | | variables.rs:94:14:96:5 | BlockExpr | variables.rs:93:11:94:12 | LetExpr | | | variables.rs:95:9:95:17 | PathExpr | variables.rs:95:19:95:20 | s2 | | | variables.rs:95:9:95:21 | CallExpr | variables.rs:94:14:96:5 | BlockExpr | | @@ -455,10 +457,11 @@ edges | variables.rs:224:13:224:27 | ExprStmt | variables.rs:224:13:224:21 | PathExpr | | | variables.rs:224:23:224:25 | a11 | variables.rs:224:13:224:26 | CallExpr | | | variables.rs:225:13:228:13 | IfExpr | variables.rs:223:12:229:9 | BlockExpr | | -| variables.rs:225:16:226:15 | LetExpr | variables.rs:225:20:225:36 | TupleStructPat | | +| variables.rs:225:16:226:15 | LetExpr | variables.rs:226:15:226:15 | e | | | variables.rs:225:20:225:36 | TupleStructPat | variables.rs:225:13:228:13 | IfExpr | no-match | | variables.rs:225:20:225:36 | TupleStructPat | variables.rs:225:33:225:35 | a12 | match | | variables.rs:225:33:225:35 | a12 | variables.rs:227:17:227:32 | ExprStmt | match | +| variables.rs:226:15:226:15 | e | variables.rs:225:20:225:36 | TupleStructPat | | | variables.rs:226:17:228:13 | BlockExpr | variables.rs:225:13:228:13 | IfExpr | | | variables.rs:227:17:227:25 | PathExpr | variables.rs:227:28:227:30 | a12 | | | variables.rs:227:17:227:31 | CallExpr | variables.rs:226:17:228:13 | BlockExpr | | @@ -674,7 +677,10 @@ edges | variables.rs:332:5:332:17 | ExprStmt | variables.rs:332:5:332:13 | PathExpr | | | variables.rs:332:15:332:15 | a | variables.rs:332:5:332:16 | CallExpr | | | variables.rs:333:5:333:27 | MethodCallExpr | variables.rs:334:5:334:17 | ExprStmt | | -| variables.rs:333:5:333:28 | ExprStmt | variables.rs:333:5:333:27 | MethodCallExpr | | +| variables.rs:333:5:333:28 | ExprStmt | variables.rs:333:25:333:26 | 10 | | +| variables.rs:333:6:333:11 | RefExpr | variables.rs:333:5:333:27 | MethodCallExpr | | +| variables.rs:333:11:333:11 | a | variables.rs:333:6:333:11 | RefExpr | | +| variables.rs:333:25:333:26 | 10 | variables.rs:333:11:333:11 | a | | | variables.rs:334:5:334:13 | PathExpr | variables.rs:334:15:334:15 | a | | | variables.rs:334:5:334:16 | CallExpr | variables.rs:329:17:335:1 | BlockExpr | | | variables.rs:334:5:334:17 | ExprStmt | variables.rs:334:5:334:13 | PathExpr | |