@@ -6553,6 +6553,116 @@ where
65536553 assert ! ( err. message. contains( "matching types" ) || err. message. contains( "u128" ) , "u64==u128 rejected: {}" , err. message) ;
65546554 }
65556555
6556+ #[ test]
6557+ fn expected_type_does_not_widen_non_literal_let_boundary ( ) {
6558+ let err = check ( & source_module (
6559+ r#"
6560+ module types::expected_let_no_widen
6561+
6562+ action bad(x: u16) -> u64
6563+ where
6564+ let y: u64 = x
6565+ return y
6566+ "# ,
6567+ ) )
6568+ . unwrap_err ( ) ;
6569+ assert ! (
6570+ err. message. contains( "type mismatch" ) || err. message. contains( "mismatch" ) ,
6571+ "let expected type should not widen a non-literal u16 into u64: {}" ,
6572+ err. message
6573+ ) ;
6574+ }
6575+
6576+ #[ test]
6577+ fn expected_type_does_not_widen_non_literal_return_boundary ( ) {
6578+ let err = check ( & source_module (
6579+ r#"
6580+ module types::expected_return_no_widen
6581+
6582+ action bad(x: u16) -> u64
6583+ where
6584+ return x
6585+ "# ,
6586+ ) )
6587+ . unwrap_err ( ) ;
6588+ assert ! (
6589+ err. message. contains( "return type" ) || err. message. contains( "mismatch" ) ,
6590+ "return expected type should not widen a non-literal u16 into u64: {}" ,
6591+ err. message
6592+ ) ;
6593+ }
6594+
6595+ #[ test]
6596+ fn expected_type_does_not_widen_non_literal_abi_arg_boundary ( ) {
6597+ let err = check ( & source_module (
6598+ r#"
6599+ module types::expected_abi_no_widen
6600+
6601+ fn takes_u64(x: u64) -> u64 {
6602+ return x
6603+ }
6604+
6605+ action bad(x: u16) -> u64
6606+ where
6607+ return takes_u64(x)
6608+ "# ,
6609+ ) )
6610+ . unwrap_err ( ) ;
6611+ assert ! (
6612+ err. message. contains( "argument 1 type mismatch" ) ,
6613+ "ABI argument expected type should not widen a non-literal u16 into u64: {}" ,
6614+ err. message
6615+ ) ;
6616+ }
6617+
6618+ #[ test]
6619+ fn expected_type_does_not_widen_non_literal_field_boundary ( ) {
6620+ let err = check ( & source_module (
6621+ r#"
6622+ module types::expected_field_no_widen
6623+
6624+ struct Holder {
6625+ value: u64,
6626+ }
6627+
6628+ action bad(x: u16) -> u64
6629+ where
6630+ let holder = Holder { value: x }
6631+ return holder.value
6632+ "# ,
6633+ ) )
6634+ . unwrap_err ( ) ;
6635+ assert ! (
6636+ err. message. contains( "type mismatch" ) ,
6637+ "field expected type should not widen a non-literal u16 into u64: {}" ,
6638+ err. message
6639+ ) ;
6640+ }
6641+
6642+ #[ test]
6643+ fn explicit_cast_can_cross_integer_width_boundary ( ) {
6644+ check ( & source_module (
6645+ r#"
6646+ module types::explicit_cast_boundary
6647+
6648+ struct Holder {
6649+ value: u64,
6650+ }
6651+
6652+ fn takes_u64(x: u64) -> u64 {
6653+ return x
6654+ }
6655+
6656+ action good(x: u16) -> u64
6657+ where
6658+ let y: u64 = x as u64
6659+ let holder = Holder { value: x as u64 }
6660+ return takes_u64(y) + holder.value
6661+ "# ,
6662+ ) )
6663+ . expect ( "explicit casts should be accepted across integer width boundaries" ) ;
6664+ }
6665+
65566666 #[ test]
65576667 fn contextual_integer_literals_fit_declared_widths ( ) {
65586668 let module = source_module (
0 commit comments