@@ -75,6 +75,7 @@ fn test_set_var_pos() {
7575enum MyFieldEnum {
7676 C { field_c : i64 } ,
7777 D { field_d : i64 } ,
78+ E { field_e : Option < i64 > } ,
7879}
7980
8081// has a flow model
@@ -101,6 +102,7 @@ fn test_set_var_field() {
101102 match e1 {
102103 MyFieldEnum :: C { field_c : i } => sink ( i) ,
103104 MyFieldEnum :: D { field_d : i } => sink ( i) , // $ hasValueFlow=5
105+ MyFieldEnum :: E { field_e : o } => ( )
104106 }
105107}
106108
@@ -246,11 +248,30 @@ fn enum_source(i: i64) -> MyFieldEnum {
246248 MyFieldEnum :: C { field_c : 0 }
247249}
248250
251+ // has a source model
252+ fn enum_source_nested ( i : i64 ) -> MyFieldEnum {
253+ MyFieldEnum :: C { field_c : 0 }
254+ }
255+
249256fn test_enum_source ( ) {
250257 let s = enum_source ( 12 ) ;
251258 match s {
252259 MyFieldEnum :: C { field_c : i } => sink ( i) ,
253260 MyFieldEnum :: D { field_d : i } => sink ( i) , // $ hasValueFlow=12
261+ MyFieldEnum :: E { field_e : o } => ( )
262+ }
263+
264+ let s = enum_source_nested ( 13 ) ;
265+ match s {
266+ MyFieldEnum :: C { field_c : i } => sink ( i) ,
267+ MyFieldEnum :: D { field_d : i } => sink ( i) ,
268+ MyFieldEnum :: E { field_e : o } =>
269+ {
270+ match o {
271+ Some ( i) => sink ( i) , // $ hasValueFlow=13
272+ None => ( )
273+ }
274+ }
254275 }
255276}
256277
@@ -260,17 +281,24 @@ fn test_enum_method_source() {
260281 match s {
261282 MyFieldEnum :: C { field_c : i } => sink ( i) , // $ hasValueFlow=13
262283 MyFieldEnum :: D { field_d : i } => sink ( i) ,
284+ MyFieldEnum :: E { field_e : o } => ( )
263285 }
264286}
265287
266288mod source_into_function {
289+ use crate :: MyFieldEnum ;
267290 use super :: sink;
268291
269292 // has a source model
270293 fn pass_source < A > ( _i : i64 , f : impl FnOnce ( i64 ) -> A ) -> A {
271294 f ( 42 )
272295 }
273296
297+ // has a source model
298+ fn pass_source_nested ( _i : i64 , f : impl FnOnce ( MyFieldEnum ) -> ( ) ) {
299+ f ( MyFieldEnum :: C { field_c : 0 } )
300+ }
301+
274302 fn test_source_into_function ( ) {
275303 let a = |a| sink ( a) ; // $ hasValueFlow=1
276304 pass_source ( 1 , a) ;
@@ -287,16 +315,57 @@ mod source_into_function {
287315 pass_source ( 4 , async move |a| {
288316 sink ( a) ; // $ hasValueFlow=4
289317 } ) ;
318+
319+ pass_source_nested ( 5 , |e| {
320+ match e {
321+ MyFieldEnum :: C { field_c : i } => sink ( i) ,
322+ MyFieldEnum :: D { field_d : i } => sink ( i) ,
323+ MyFieldEnum :: E { field_e : o } =>
324+ {
325+ match o {
326+ Some ( i) => sink ( i) , // $ hasValueFlow=5
327+ None => ( )
328+ }
329+ }
330+ }
331+ } ) ;
332+ }
333+ }
334+
335+ mod sink_out_of_function {
336+ use crate :: MyFieldEnum ;
337+ use super :: source;
338+
339+ // has a sink model
340+ fn pass_sink ( f : impl FnOnce ( ( ) ) -> i64 ) { }
341+
342+ // has a sink model
343+ fn pass_sink_nested ( f : impl FnOnce ( ( ) ) -> MyFieldEnum ) { }
344+
345+ fn test_sink_out_of_function ( ) {
346+ let a = |a| source ( 1 ) ;
347+ pass_sink ( a) ; // $ MISSING: hasValueFlow=1
348+
349+ let b = |_a| {
350+ let s = source ( 2 ) ;
351+ MyFieldEnum :: E { field_e : Option :: Some ( s) }
352+ } ;
353+ pass_sink_nested ( b) ; // $ MISSING: hasValueFlow=2
290354 }
291355}
292356
293357// has a sink model
294358fn enum_sink ( e : MyFieldEnum ) { }
295359
360+ // has a sink model
361+ fn enum_sink_nested ( e : MyFieldEnum ) { }
362+
296363fn test_enum_sink ( ) {
297364 let s = source ( 14 ) ;
298365 enum_sink ( MyFieldEnum :: C { field_c : s } ) ; // $ hasValueFlow=14
299366 enum_sink ( MyFieldEnum :: D { field_d : s } ) ;
367+ enum_sink_nested ( MyFieldEnum :: E { field_e : None } ) ;
368+ enum_sink_nested ( MyFieldEnum :: E { field_e : Some ( s) } ) ; // $ hasValueFlow=14
300369}
301370
302371fn test_enum_method_sink ( ) {
@@ -332,6 +401,17 @@ fn test_arg_source() {
332401 sink ( i) // $ hasValueFlow=i
333402}
334403
404+ trait MyTrait {
405+ // has a source model
406+ fn test_param_source ( i : i64 ) ;
407+ }
408+
409+ impl MyTrait for ( ) {
410+ fn test_param_source ( i : i64 ) {
411+ sink ( i) // $ MISSING: hasValueFlow=i
412+ }
413+ }
414+
335415struct MyStruct2 ( i64 ) ;
336416
337417impl PartialEq for MyStruct {
0 commit comments