@@ -1003,6 +1003,75 @@ fn main() {
10031003 assert ! ( warning_names( prog) . is_empty( ) ) ;
10041004 }
10051005
1006+ #[ test]
1007+ fn shadowed_outer_variable_unused_warns ( ) {
1008+ // Outer `x` is never referenced; inner `x` shadows it and is used.
1009+ // Only the outer binding should warn.
1010+ let prog = r#"fn main() {
1011+ let x: u8 = 1;
1012+ let y: u8 = {
1013+ let x: u8 = 2;
1014+ x
1015+ };
1016+ assert!(jet::eq_8(y, 2))
1017+ }"# ;
1018+ let names = warning_names ( prog) ;
1019+ assert_eq ! (
1020+ names. len( ) ,
1021+ 1 ,
1022+ "Expected exactly one warning (outer x), got: {names:?}" ,
1023+ ) ;
1024+ assert ! (
1025+ matches!( & names[ 0 ] , WarningName :: UnusedVariable ( id) if id. as_inner( ) == "x" ) ,
1026+ "Expected UnusedVariable(x) for the outer binding, got: {:?}" ,
1027+ names,
1028+ ) ;
1029+ }
1030+
1031+ #[ test]
1032+ fn shadowed_inner_variable_unused_warns ( ) {
1033+ // Outer `x` is used as the RHS of the inner binding.
1034+ // Inner `x` is never referenced after being bound, so it should warn.
1035+ let prog = r#"fn main() {
1036+ let x: u8 = 1;
1037+ let y: u8 = {
1038+ let x: u8 = x;
1039+ 0
1040+ };
1041+ assert!(jet::eq_8(y, 0))
1042+ }"# ;
1043+ let names = warning_names ( prog) ;
1044+ assert_eq ! (
1045+ names. len( ) ,
1046+ 1 ,
1047+ "Expected exactly one warning (inner x), got: {names:?}" ,
1048+ ) ;
1049+ assert ! (
1050+ matches!( & names[ 0 ] , WarningName :: UnusedVariable ( id) if id. as_inner( ) == "x" ) ,
1051+ "Expected UnusedVariable(x) for the inner binding, got: {:?}" ,
1052+ names,
1053+ ) ;
1054+ }
1055+
1056+ #[ test]
1057+ fn outer_variable_used_after_inner_scope_no_warning ( ) {
1058+ // `x` is bound in the outer scope, referenced after an inner block
1059+ // that binds a different name. Neither binding should warn.
1060+ let prog = r#"fn main() {
1061+ let x: u8 = 1;
1062+ let y: u8 = {
1063+ let z: u8 = 2;
1064+ z
1065+ };
1066+ let (_, sum): (bool, u8) = jet::add_8(x, y);
1067+ assert!(jet::eq_8(sum, 3))
1068+ }"# ;
1069+ assert ! (
1070+ warning_names( prog) . is_empty( ) ,
1071+ "Expected no warnings when all variables are used" ,
1072+ ) ;
1073+ }
1074+
10061075 #[ test]
10071076 fn deny_warning_by_category_is_error ( ) {
10081077 use crate :: WarnCategory ;
0 commit comments