diff --git a/rust/ql/lib/codeql/rust/internal/TypeMention.qll b/rust/ql/lib/codeql/rust/internal/TypeMention.qll index 74661bb86c3c..2f451c521d89 100644 --- a/rust/ql/lib/codeql/rust/internal/TypeMention.qll +++ b/rust/ql/lib/codeql/rust/internal/TypeMention.qll @@ -222,6 +222,33 @@ class NonAliasPathTypeMention extends PathTypeMention { result = this.getPositionalTypeArgument(pragma[only_bind_into](i), path) and tp = this.resolveRootType().getPositionalTypeParameter(pragma[only_bind_into](i)) ) + or + // Handle the special syntactic sugar for function traits. The syntactic + // form is detected by the presence of a parenthesized argument list which + // is a mandatory part of the syntax [1]. + // + // For now we only support `FnOnce` as we can't support the "inherited" + // associated types of `Fn` and `FnMut` yet. + // + // [1]: https://doc.rust-lang.org/reference/paths.html#grammar-TypePathFn + exists(FnOnceTrait t, PathSegment s | + t = resolved and + s = this.getSegment() and + s.hasParenthesizedArgList() + | + tp = TTypeParamTypeParameter(t.getTypeParam()) and + result = s.getParenthesizedArgList().(TypeMention).resolveTypeAt(path) + or + tp = TAssociatedTypeTypeParameter(t.getOutputType()) and + ( + result = s.getRetType().getTypeRepr().(TypeMention).resolveTypeAt(path) + or + // When the `-> ...` return type is omitted, it defaults to `()`. + not s.hasRetType() and + result instanceof UnitType and + path.isEmpty() + ) + ) } pragma[nomagic] @@ -256,17 +283,6 @@ class NonAliasPathTypeMention extends PathTypeMention { result = alias.getTypeRepr() and tp = TAssociatedTypeTypeParameter(this.getResolvedAlias(pragma[only_bind_into](name))) ) - or - // Handle the special syntactic sugar for function traits. For now we only - // support `FnOnce` as we can't support the "inherited" associated types of - // `Fn` and `FnMut` yet. - exists(FnOnceTrait t | t = resolved | - tp = TTypeParamTypeParameter(t.getTypeParam()) and - result = this.getSegment().getParenthesizedArgList() - or - tp = TAssociatedTypeTypeParameter(t.getOutputType()) and - result = this.getSegment().getRetType().getTypeRepr() - ) } pragma[nomagic] diff --git a/rust/ql/test/library-tests/type-inference/closure.rs b/rust/ql/test/library-tests/type-inference/closure.rs index 43b26819325e..e5a9c83aa07b 100644 --- a/rust/ql/test/library-tests/type-inference/closure.rs +++ b/rust/ql/test/library-tests/type-inference/closure.rs @@ -36,6 +36,10 @@ mod fn_once_trait { let _return = f(true); // $ type=_return:i64 } + fn return_type_omitted(f: F) { + let _return = f(true); // $ type=_return:() + } + fn argument_type i64>(f: F) { let arg = Default::default(); // $ target=default type=arg:bool f(arg); 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 a93284881564..353b18ff8409 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.expected +++ b/rust/ql/test/library-tests/type-inference/type-inference.expected @@ -230,51 +230,55 @@ inferCertainType | closure.rs:35:50:37:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:36:23:36:23 | f | | closure.rs:35:20:35:41 | F | | closure.rs:36:25:36:28 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:39:46:39:46 | f | | closure.rs:39:22:39:43 | F | -| closure.rs:39:52:42:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:41:9:41:9 | f | | closure.rs:39:22:39:43 | F | -| closure.rs:44:39:44:39 | f | | closure.rs:44:20:44:36 | F | -| closure.rs:44:45:44:45 | a | | closure.rs:44:14:44:14 | A | -| closure.rs:44:56:46:5 | { ... } | | closure.rs:44:17:44:17 | B | -| closure.rs:45:9:45:9 | f | | closure.rs:44:20:44:36 | F | -| closure.rs:45:11:45:11 | a | | closure.rs:44:14:44:14 | A | -| closure.rs:48:18:48:18 | f | | closure.rs:48:21:48:43 | impl ... | -| closure.rs:48:53:50:5 | { ... } | | {EXTERNAL LOCATION} | i64 | -| closure.rs:49:9:49:9 | f | | closure.rs:48:21:48:43 | impl ... | -| closure.rs:52:15:64:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:53:18:53:18 | x | | {EXTERNAL LOCATION} | bool | -| closure.rs:54:16:54:16 | x | | {EXTERNAL LOCATION} | bool | -| closure.rs:60:27:60:30 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:63:13:63:15 | _r2 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:63:19:63:30 | apply_two(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:68:54:68:54 | f | | {EXTERNAL LOCATION} | Box | -| closure.rs:68:54:68:54 | f | A | {EXTERNAL LOCATION} | Global | -| closure.rs:68:54:68:54 | f | T | closure.rs:68:26:68:51 | F | -| closure.rs:68:65:68:67 | arg | | closure.rs:68:20:68:20 | A | -| closure.rs:68:78:70:5 | { ... } | | closure.rs:68:23:68:23 | B | -| closure.rs:69:9:69:9 | f | | {EXTERNAL LOCATION} | Box | -| closure.rs:69:9:69:9 | f | A | {EXTERNAL LOCATION} | Global | -| closure.rs:69:9:69:9 | f | T | closure.rs:68:26:68:51 | F | -| closure.rs:69:11:69:13 | arg | | closure.rs:68:20:68:20 | A | -| closure.rs:72:30:72:30 | f | | {EXTERNAL LOCATION} | Box | -| closure.rs:72:30:72:30 | f | A | {EXTERNAL LOCATION} | Global | -| closure.rs:72:30:72:30 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:72:30:72:30 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:72:30:72:30 | f | T.dyn(Args).T0 | closure.rs:72:24:72:24 | A | -| closure.rs:72:30:72:30 | f | T.dyn(Output) | closure.rs:72:27:72:27 | B | -| closure.rs:72:58:72:60 | arg | | closure.rs:72:24:72:24 | A | -| closure.rs:72:66:75:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:73:31:73:31 | f | | {EXTERNAL LOCATION} | Box | -| closure.rs:73:31:73:31 | f | A | {EXTERNAL LOCATION} | Global | -| closure.rs:73:31:73:31 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:73:31:73:31 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:73:31:73:31 | f | T.dyn(Args).T0 | closure.rs:72:24:72:24 | A | -| closure.rs:73:31:73:31 | f | T.dyn(Output) | closure.rs:72:27:72:27 | B | -| closure.rs:73:34:73:36 | arg | | closure.rs:72:24:72:24 | A | -| closure.rs:74:31:74:53 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| closure.rs:74:31:74:53 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| closure.rs:74:41:74:41 | _ | | {EXTERNAL LOCATION} | i64 | -| closure.rs:74:49:74:52 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:39:45:39:45 | f | | closure.rs:39:28:39:42 | F | +| closure.rs:39:51:41:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:40:23:40:23 | f | | closure.rs:39:28:39:42 | F | +| closure.rs:40:25:40:28 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:43:46:43:46 | f | | closure.rs:43:22:43:43 | F | +| closure.rs:43:52:46:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:45:9:45:9 | f | | closure.rs:43:22:43:43 | F | +| closure.rs:48:39:48:39 | f | | closure.rs:48:20:48:36 | F | +| closure.rs:48:45:48:45 | a | | closure.rs:48:14:48:14 | A | +| closure.rs:48:56:50:5 | { ... } | | closure.rs:48:17:48:17 | B | +| closure.rs:49:9:49:9 | f | | closure.rs:48:20:48:36 | F | +| closure.rs:49:11:49:11 | a | | closure.rs:48:14:48:14 | A | +| closure.rs:52:18:52:18 | f | | closure.rs:52:21:52:43 | impl ... | +| closure.rs:52:53:54:5 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:53:9:53:9 | f | | closure.rs:52:21:52:43 | impl ... | +| closure.rs:56:15:68:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:57:18:57:18 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:58:16:58:16 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:64:27:64:30 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:67:13:67:15 | _r2 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:67:19:67:30 | apply_two(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:72:54:72:54 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:72:54:72:54 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:72:54:72:54 | f | T | closure.rs:72:26:72:51 | F | +| closure.rs:72:65:72:67 | arg | | closure.rs:72:20:72:20 | A | +| closure.rs:72:78:74:5 | { ... } | | closure.rs:72:23:72:23 | B | +| closure.rs:73:9:73:9 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:73:9:73:9 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:73:9:73:9 | f | T | closure.rs:72:26:72:51 | F | +| closure.rs:73:11:73:13 | arg | | closure.rs:72:20:72:20 | A | +| closure.rs:76:30:76:30 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:76:30:76:30 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:76:30:76:30 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:76:30:76:30 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:76:30:76:30 | f | T.dyn(Args).T0 | closure.rs:76:24:76:24 | A | +| closure.rs:76:30:76:30 | f | T.dyn(Output) | closure.rs:76:27:76:27 | B | +| closure.rs:76:58:76:60 | arg | | closure.rs:76:24:76:24 | A | +| closure.rs:76:66:79:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:77:31:77:31 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:77:31:77:31 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:77:31:77:31 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:77:31:77:31 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:77:31:77:31 | f | T.dyn(Args).T0 | closure.rs:76:24:76:24 | A | +| closure.rs:77:31:77:31 | f | T.dyn(Output) | closure.rs:76:27:76:27 | B | +| closure.rs:77:34:77:36 | arg | | closure.rs:76:24:76:24 | A | +| closure.rs:78:31:78:53 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| closure.rs:78:31:78:53 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| closure.rs:78:41:78:41 | _ | | {EXTERNAL LOCATION} | i64 | +| closure.rs:78:49:78:52 | true | | {EXTERNAL LOCATION} | bool | | dereference.rs:13:14:13:18 | SelfParam | | {EXTERNAL LOCATION} | & | | dereference.rs:13:14:13:18 | SelfParam | TRef | dereference.rs:5:1:7:1 | MyIntPointer | | dereference.rs:13:29:15:5 | { ... } | | {EXTERNAL LOCATION} | & | @@ -4976,111 +4980,117 @@ inferType | closure.rs:36:23:36:23 | f | | closure.rs:35:20:35:41 | F | | closure.rs:36:23:36:29 | f(...) | | {EXTERNAL LOCATION} | i64 | | closure.rs:36:25:36:28 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:39:46:39:46 | f | | closure.rs:39:22:39:43 | F | -| closure.rs:39:52:42:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:40:13:40:15 | arg | | {EXTERNAL LOCATION} | bool | -| closure.rs:40:19:40:36 | ...::default(...) | | {EXTERNAL LOCATION} | bool | -| closure.rs:41:9:41:9 | f | | closure.rs:39:22:39:43 | F | -| closure.rs:41:9:41:14 | f(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:41:11:41:13 | arg | | {EXTERNAL LOCATION} | bool | -| closure.rs:44:39:44:39 | f | | closure.rs:44:20:44:36 | F | -| closure.rs:44:45:44:45 | a | | closure.rs:44:14:44:14 | A | -| closure.rs:44:56:46:5 | { ... } | | closure.rs:44:17:44:17 | B | -| closure.rs:45:9:45:9 | f | | closure.rs:44:20:44:36 | F | -| closure.rs:45:9:45:12 | f(...) | | closure.rs:44:17:44:17 | B | -| closure.rs:45:11:45:11 | a | | closure.rs:44:14:44:14 | A | -| closure.rs:48:18:48:18 | f | | closure.rs:48:21:48:43 | impl ... | -| closure.rs:48:53:50:5 | { ... } | | {EXTERNAL LOCATION} | i64 | -| closure.rs:49:9:49:9 | f | | closure.rs:48:21:48:43 | impl ... | -| closure.rs:49:9:49:12 | f(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:49:11:49:11 | 2 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:49:11:49:11 | 2 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:52:15:64:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:53:13:53:13 | f | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:53:13:53:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:53:13:53:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:53:13:53:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i32 | -| closure.rs:53:13:53:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:53:17:59:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:53:17:59:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:53:17:59:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:53:17:59:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i32 | -| closure.rs:53:17:59:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:53:18:53:18 | x | | {EXTERNAL LOCATION} | bool | -| closure.rs:53:34:59:9 | { ... } | | {EXTERNAL LOCATION} | i32 | -| closure.rs:53:34:59:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| closure.rs:54:13:58:13 | if x {...} else {...} | | {EXTERNAL LOCATION} | i32 | -| closure.rs:54:13:58:13 | if x {...} else {...} | | {EXTERNAL LOCATION} | i64 | -| closure.rs:54:16:54:16 | x | | {EXTERNAL LOCATION} | bool | -| closure.rs:54:18:56:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| closure.rs:54:18:56:13 | { ... } | | {EXTERNAL LOCATION} | i64 | -| closure.rs:55:17:55:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:55:17:55:17 | 1 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:56:20:58:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| closure.rs:56:20:58:13 | { ... } | | {EXTERNAL LOCATION} | i64 | -| closure.rs:57:17:57:17 | 0 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:57:17:57:17 | 0 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:60:13:60:14 | _r | | {EXTERNAL LOCATION} | i32 | -| closure.rs:60:13:60:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:60:18:60:31 | apply(...) | | {EXTERNAL LOCATION} | i32 | -| closure.rs:60:18:60:31 | apply(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:60:24:60:24 | f | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:60:24:60:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:60:24:60:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:60:24:60:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i32 | -| closure.rs:60:24:60:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:60:27:60:30 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:62:13:62:13 | f | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:62:13:62:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:62:17:62:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:62:17:62:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:62:25:62:25 | 1 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:63:13:63:15 | _r2 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:63:19:63:30 | apply_two(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:63:29:63:29 | f | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:63:29:63:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:68:54:68:54 | f | | {EXTERNAL LOCATION} | Box | -| closure.rs:68:54:68:54 | f | A | {EXTERNAL LOCATION} | Global | -| closure.rs:68:54:68:54 | f | T | closure.rs:68:26:68:51 | F | -| closure.rs:68:65:68:67 | arg | | closure.rs:68:20:68:20 | A | -| closure.rs:68:78:70:5 | { ... } | | closure.rs:68:23:68:23 | B | -| closure.rs:69:9:69:9 | f | | {EXTERNAL LOCATION} | Box | -| closure.rs:69:9:69:9 | f | A | {EXTERNAL LOCATION} | Global | -| closure.rs:69:9:69:9 | f | T | closure.rs:68:26:68:51 | F | -| closure.rs:69:9:69:14 | f(...) | | closure.rs:68:23:68:23 | B | -| closure.rs:69:11:69:13 | arg | | closure.rs:68:20:68:20 | A | -| closure.rs:72:30:72:30 | f | | {EXTERNAL LOCATION} | Box | -| closure.rs:72:30:72:30 | f | A | {EXTERNAL LOCATION} | Global | -| closure.rs:72:30:72:30 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:72:30:72:30 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:72:30:72:30 | f | T.dyn(Args).T0 | closure.rs:72:24:72:24 | A | -| closure.rs:72:30:72:30 | f | T.dyn(Output) | closure.rs:72:27:72:27 | B | -| closure.rs:72:58:72:60 | arg | | closure.rs:72:24:72:24 | A | -| closure.rs:72:66:75:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:73:13:73:15 | _r1 | | closure.rs:72:27:72:27 | B | -| closure.rs:73:19:73:37 | apply_boxed(...) | | closure.rs:72:27:72:27 | B | -| closure.rs:73:31:73:31 | f | | {EXTERNAL LOCATION} | Box | -| closure.rs:73:31:73:31 | f | A | {EXTERNAL LOCATION} | Global | -| closure.rs:73:31:73:31 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:73:31:73:31 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:73:31:73:31 | f | T.dyn(Args).T0 | closure.rs:72:24:72:24 | A | -| closure.rs:73:31:73:31 | f | T.dyn(Output) | closure.rs:72:27:72:27 | B | -| closure.rs:73:34:73:36 | arg | | closure.rs:72:24:72:24 | A | -| closure.rs:74:13:74:15 | _r2 | | {EXTERNAL LOCATION} | bool | -| closure.rs:74:19:74:57 | apply_boxed(...) | | {EXTERNAL LOCATION} | bool | -| closure.rs:74:31:74:53 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| closure.rs:74:31:74:53 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| closure.rs:74:31:74:53 | ...::new(...) | T | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:74:31:74:53 | ...::new(...) | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:74:31:74:53 | ...::new(...) | T.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:74:31:74:53 | ...::new(...) | T.dyn(Output) | {EXTERNAL LOCATION} | bool | -| closure.rs:74:40:74:52 | \|...\| true | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:74:40:74:52 | \|...\| true | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:74:40:74:52 | \|...\| true | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:74:40:74:52 | \|...\| true | dyn(Output) | {EXTERNAL LOCATION} | bool | -| closure.rs:74:41:74:41 | _ | | {EXTERNAL LOCATION} | i64 | -| closure.rs:74:49:74:52 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:74:56:74:56 | 3 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:39:45:39:45 | f | | closure.rs:39:28:39:42 | F | +| closure.rs:39:51:41:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:40:13:40:19 | _return | | {EXTERNAL LOCATION} | () | +| closure.rs:40:23:40:23 | f | | closure.rs:39:28:39:42 | F | +| closure.rs:40:23:40:29 | f(...) | | {EXTERNAL LOCATION} | () | +| closure.rs:40:25:40:28 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:43:46:43:46 | f | | closure.rs:43:22:43:43 | F | +| closure.rs:43:52:46:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:44:13:44:15 | arg | | {EXTERNAL LOCATION} | bool | +| closure.rs:44:19:44:36 | ...::default(...) | | {EXTERNAL LOCATION} | bool | +| closure.rs:45:9:45:9 | f | | closure.rs:43:22:43:43 | F | +| closure.rs:45:9:45:14 | f(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:45:11:45:13 | arg | | {EXTERNAL LOCATION} | bool | +| closure.rs:48:39:48:39 | f | | closure.rs:48:20:48:36 | F | +| closure.rs:48:45:48:45 | a | | closure.rs:48:14:48:14 | A | +| closure.rs:48:56:50:5 | { ... } | | closure.rs:48:17:48:17 | B | +| closure.rs:49:9:49:9 | f | | closure.rs:48:20:48:36 | F | +| closure.rs:49:9:49:12 | f(...) | | closure.rs:48:17:48:17 | B | +| closure.rs:49:11:49:11 | a | | closure.rs:48:14:48:14 | A | +| closure.rs:52:18:52:18 | f | | closure.rs:52:21:52:43 | impl ... | +| closure.rs:52:53:54:5 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:53:9:53:9 | f | | closure.rs:52:21:52:43 | impl ... | +| closure.rs:53:9:53:12 | f(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:53:11:53:11 | 2 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:53:11:53:11 | 2 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:56:15:68:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:57:13:57:13 | f | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:57:13:57:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:57:13:57:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:57:13:57:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i32 | +| closure.rs:57:13:57:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:57:17:63:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:57:17:63:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:57:17:63:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:57:17:63:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i32 | +| closure.rs:57:17:63:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:57:18:57:18 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:57:34:63:9 | { ... } | | {EXTERNAL LOCATION} | i32 | +| closure.rs:57:34:63:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:58:13:62:13 | if x {...} else {...} | | {EXTERNAL LOCATION} | i32 | +| closure.rs:58:13:62:13 | if x {...} else {...} | | {EXTERNAL LOCATION} | i64 | +| closure.rs:58:16:58:16 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:58:18:60:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| closure.rs:58:18:60:13 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:59:17:59:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:59:17:59:17 | 1 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:60:20:62:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| closure.rs:60:20:62:13 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:61:17:61:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:61:17:61:17 | 0 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:64:13:64:14 | _r | | {EXTERNAL LOCATION} | i32 | +| closure.rs:64:13:64:14 | _r | | {EXTERNAL LOCATION} | i64 | +| closure.rs:64:18:64:31 | apply(...) | | {EXTERNAL LOCATION} | i32 | +| closure.rs:64:18:64:31 | apply(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:64:24:64:24 | f | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:64:24:64:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:64:24:64:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:64:24:64:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i32 | +| closure.rs:64:24:64:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:64:27:64:30 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:66:13:66:13 | f | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:66:13:66:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:66:17:66:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:66:17:66:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:66:25:66:25 | 1 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:67:13:67:15 | _r2 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:67:19:67:30 | apply_two(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:67:29:67:29 | f | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:67:29:67:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:72:54:72:54 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:72:54:72:54 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:72:54:72:54 | f | T | closure.rs:72:26:72:51 | F | +| closure.rs:72:65:72:67 | arg | | closure.rs:72:20:72:20 | A | +| closure.rs:72:78:74:5 | { ... } | | closure.rs:72:23:72:23 | B | +| closure.rs:73:9:73:9 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:73:9:73:9 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:73:9:73:9 | f | T | closure.rs:72:26:72:51 | F | +| closure.rs:73:9:73:14 | f(...) | | closure.rs:72:23:72:23 | B | +| closure.rs:73:11:73:13 | arg | | closure.rs:72:20:72:20 | A | +| closure.rs:76:30:76:30 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:76:30:76:30 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:76:30:76:30 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:76:30:76:30 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:76:30:76:30 | f | T.dyn(Args).T0 | closure.rs:76:24:76:24 | A | +| closure.rs:76:30:76:30 | f | T.dyn(Output) | closure.rs:76:27:76:27 | B | +| closure.rs:76:58:76:60 | arg | | closure.rs:76:24:76:24 | A | +| closure.rs:76:66:79:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:77:13:77:15 | _r1 | | closure.rs:76:27:76:27 | B | +| closure.rs:77:19:77:37 | apply_boxed(...) | | closure.rs:76:27:76:27 | B | +| closure.rs:77:31:77:31 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:77:31:77:31 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:77:31:77:31 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:77:31:77:31 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:77:31:77:31 | f | T.dyn(Args).T0 | closure.rs:76:24:76:24 | A | +| closure.rs:77:31:77:31 | f | T.dyn(Output) | closure.rs:76:27:76:27 | B | +| closure.rs:77:34:77:36 | arg | | closure.rs:76:24:76:24 | A | +| closure.rs:78:13:78:15 | _r2 | | {EXTERNAL LOCATION} | bool | +| closure.rs:78:19:78:57 | apply_boxed(...) | | {EXTERNAL LOCATION} | bool | +| closure.rs:78:31:78:53 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| closure.rs:78:31:78:53 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| closure.rs:78:31:78:53 | ...::new(...) | T | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:78:31:78:53 | ...::new(...) | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:78:31:78:53 | ...::new(...) | T.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:78:31:78:53 | ...::new(...) | T.dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:78:40:78:52 | \|...\| true | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:78:40:78:52 | \|...\| true | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:78:40:78:52 | \|...\| true | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:78:40:78:52 | \|...\| true | dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:78:41:78:41 | _ | | {EXTERNAL LOCATION} | i64 | +| closure.rs:78:49:78:52 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:78:56:78:56 | 3 | | {EXTERNAL LOCATION} | i32 | | dereference.rs:13:14:13:18 | SelfParam | | {EXTERNAL LOCATION} | & | | dereference.rs:13:14:13:18 | SelfParam | TRef | dereference.rs:5:1:7:1 | MyIntPointer | | dereference.rs:13:29:15:5 | { ... } | | {EXTERNAL LOCATION} | & |