@@ -2763,3 +2763,248 @@ test_verify_one_file_with_options! {
27632763 }
27642764 } => Err ( err) => assert_fails( err, 1 )
27652765}
2766+
2767+ test_verify_one_file_with_options ! {
2768+ #[ test] place_that_doesnt_return [ "new-mut-ref" ] => verus_code! {
2769+ use vstd:: prelude:: * ;
2770+
2771+ #[ allow( unreachable_code) ]
2772+ #[ verifier:: exec_allows_no_decreases_clause]
2773+ fn test1( ) {
2774+ let mut a = 4 ;
2775+ * ( { loop { } ; & mut a } ) = 5 ;
2776+ assert( false ) ;
2777+ }
2778+
2779+ #[ allow( unreachable_code) ]
2780+ #[ verifier:: exec_allows_no_decreases_clause]
2781+ fn test2( ) {
2782+ let mut a = 4 ;
2783+ * ( { loop { } ; & mut a } ) = ( { assert( false ) ; 5 } ) ;
2784+ assert( false ) ;
2785+ }
2786+
2787+ #[ allow( unreachable_code) ]
2788+ #[ verifier:: exec_allows_no_decreases_clause]
2789+ fn test2_fails( ) {
2790+ let mut a = 4 ;
2791+ * ( {
2792+ assert( false ) ; // FAILS
2793+ & mut a } ) = ( { loop { } 5 } ) ;
2794+ }
2795+
2796+ #[ allow( unreachable_code) ]
2797+ #[ verifier:: exec_allows_no_decreases_clause]
2798+ fn test3( ) {
2799+ let mut a = 4 ;
2800+ let mut a_ref: & mut u64 = loop { } ;
2801+ assert( false ) ;
2802+ }
2803+
2804+ #[ allow( unreachable_code) ]
2805+ #[ verifier:: exec_allows_no_decreases_clause]
2806+ fn test4( ) {
2807+ let y: [ [ u64 ; 2 ] ; 2 ] = [ [ 0 , 1 ] , [ 2 , 3 ] ] ;
2808+ let x = y[ ( { loop { } ; 0 } ) ] [ ( { assert( false ) ; 1 } ) ] ;
2809+ }
2810+
2811+ #[ allow( unreachable_code) ]
2812+ #[ verifier:: exec_allows_no_decreases_clause]
2813+ fn test5( ) {
2814+ let y: [ [ u64 ; 2 ] ; 2 ] = [ [ 0 , 1 ] , [ 2 , 3 ] ] ;
2815+ let x = y[ ( {
2816+ assert( false ) ; // FAILS
2817+ 1 } ) ] [ ( { loop { } ; 0 } ) ] ;
2818+ }
2819+
2820+ #[ allow( unreachable_code) ]
2821+ #[ verifier:: exec_allows_no_decreases_clause]
2822+ fn test6( y: [ & mut ( u64 , u64 ) ; 2 ] ) {
2823+ let mut y = y;
2824+ ( * y[ ( { loop { } 0 } ) ] ) . 0 = 20 ;
2825+ assert( false ) ;
2826+ }
2827+ } => Err ( e) => assert_fails( e, 2 )
2828+ }
2829+
2830+ test_verify_one_file_with_options ! {
2831+ #[ test] compound_op_that_doesnt_return [ "new-mut-ref" ] => verus_code! {
2832+ #[ allow( unreachable_code) ]
2833+ #[ verifier:: exec_allows_no_decreases_clause]
2834+ fn test1( y: [ & mut ( u64 , u64 ) ; 2 ] ) {
2835+ let mut y = y;
2836+ ( * y[ ( { loop { } 0 } ) ] ) . 0 += 20 ;
2837+ }
2838+
2839+ #[ allow( unreachable_code) ]
2840+ #[ verifier:: exec_allows_no_decreases_clause]
2841+ fn test2( y: [ & mut ( u64 , u64 ) ; 2 ] ) {
2842+ let mut y = y;
2843+ ( * y[ ( {
2844+ assert( false ) ; // FAILS
2845+ 0 } ) ] ) . 0 += ( { loop { } 20 } ) ;
2846+ }
2847+
2848+ #[ allow( unreachable_code) ]
2849+ #[ verifier:: exec_allows_no_decreases_clause]
2850+ fn test3( y: [ & mut ( u64 , u64 ) ; 2 ] ) {
2851+ let mut y = y;
2852+ ( * y[ 0 ] ) . 0 += ( { loop { } 20 } ) ;
2853+ }
2854+
2855+ #[ allow( unreachable_code) ]
2856+ #[ verifier:: exec_allows_no_decreases_clause]
2857+ fn test4( y: & mut [ & mut ( u64 , u64 ) ; 2 ] )
2858+ ensures mut_ref_current( y) == mut_ref_future( y)
2859+ {
2860+ let mut y = y;
2861+ ( * y[ 0 ] ) . 0 += ( { return ; 20 } ) ;
2862+ }
2863+
2864+ #[ allow( unreachable_code) ]
2865+ #[ verifier:: exec_allows_no_decreases_clause]
2866+ fn test4_fails( y: & mut [ & mut ( u64 , u64 ) ; 2 ] )
2867+ ensures false
2868+ {
2869+ let mut y = y;
2870+ ( * y[ 0 ] ) . 0 += ( {
2871+ return ; // FAILS
2872+ 0
2873+ } ) ;
2874+ }
2875+ } => Err ( e) => assert_fails( e, 2 )
2876+ }
2877+
2878+ test_verify_one_file_with_options ! {
2879+ #[ test] call_with_args_that_dont_return [ "new-mut-ref" ] => verus_code! {
2880+ fn call( a: & mut u64 , b: & mut u64 , c: & mut u64 ) { }
2881+
2882+ fn call_requires_false( a: & mut u64 , b: & mut u64 , c: & mut u64 )
2883+ requires false
2884+ { }
2885+
2886+ #[ verifier:: exec_allows_no_decreases_clause]
2887+ #[ allow( unreachable_code) ]
2888+ fn test1( ) {
2889+ let mut a = 20 ;
2890+ let mut b = 30 ;
2891+ let mut c = 40 ;
2892+ call_requires_false( & mut a, ( { loop { } & mut b } ) , & mut c) ;
2893+ }
2894+
2895+ #[ verifier:: exec_allows_no_decreases_clause]
2896+ #[ allow( unreachable_code) ]
2897+ fn test2( ) {
2898+ let mut a = 20 ;
2899+ let mut b = 30 ;
2900+ let mut c = 40 ;
2901+ call_requires_false( & mut a, ( loop { } ) , & mut c) ;
2902+ }
2903+
2904+ #[ verifier:: exec_allows_no_decreases_clause]
2905+ #[ allow( unreachable_code) ]
2906+ fn test3( a_ref: & mut u64 , c_ref: & mut u64 )
2907+ ensures
2908+ mut_ref_future( a_ref) == mut_ref_current( a_ref) ,
2909+ mut_ref_future( c_ref) == mut_ref_current( c_ref) ,
2910+ {
2911+ call_requires_false( a_ref, ( return ) , c_ref) ;
2912+ }
2913+
2914+ #[ verifier:: exec_allows_no_decreases_clause]
2915+ #[ allow( unreachable_code) ]
2916+ fn test3_fails( a_ref: & mut u64 , c_ref: & mut u64 )
2917+ ensures
2918+ false
2919+ {
2920+ call_requires_false( a_ref, (
2921+ return // FAILS
2922+ ) , c_ref) ;
2923+ }
2924+
2925+ #[ verifier:: exec_allows_no_decreases_clause]
2926+ #[ allow( unreachable_code) ]
2927+ fn test4( ) {
2928+ let mut a = 20 ;
2929+ let mut b = 30 ;
2930+ let mut c = 40 ;
2931+ call_requires_false( & mut a, ( loop { } ) , ( { assert( false ) ; & mut c } ) ) ;
2932+ }
2933+
2934+ #[ verifier:: exec_allows_no_decreases_clause]
2935+ #[ allow( unreachable_code) ]
2936+ fn test5( ) {
2937+ let mut a = 20 ;
2938+ let mut b = 30 ;
2939+ let mut c = 40 ;
2940+ call( ( {
2941+ assert( false ) ; // FAILS
2942+ & mut a } ) , ( loop { } ) , & mut c) ;
2943+ }
2944+ } => Err ( e) => assert_fails( e, 2 )
2945+ }
2946+
2947+ test_verify_one_file_with_options ! {
2948+ #[ test] ctor_with_args_that_dont_return [ "new-mut-ref" ] => verus_code! {
2949+ struct Ctor <' a, ' b, ' c>( & ' a mut u64 , & ' b mut u64 , & ' c mut u64 ) ;
2950+
2951+ #[ verifier:: exec_allows_no_decreases_clause]
2952+ #[ allow( unreachable_code) ]
2953+ fn test1( ) {
2954+ let mut a = 20 ;
2955+ let mut b = 30 ;
2956+ let mut c = 40 ;
2957+ let ct = Ctor ( & mut a, ( { loop { } & mut b } ) , & mut c) ;
2958+ }
2959+
2960+ #[ verifier:: exec_allows_no_decreases_clause]
2961+ #[ allow( unreachable_code) ]
2962+ fn test2( ) {
2963+ let mut a = 20 ;
2964+ let mut b = 30 ;
2965+ let mut c = 40 ;
2966+ let ct = Ctor ( & mut a, ( loop { } ) , & mut c) ;
2967+ }
2968+
2969+ #[ verifier:: exec_allows_no_decreases_clause]
2970+ #[ allow( unreachable_code) ]
2971+ fn test3( a_ref: & mut u64 , c_ref: & mut u64 )
2972+ ensures
2973+ mut_ref_future( a_ref) == mut_ref_current( a_ref) ,
2974+ mut_ref_future( c_ref) == mut_ref_current( c_ref) ,
2975+ {
2976+ let ct = Ctor ( a_ref, ( return ) , c_ref) ;
2977+ }
2978+
2979+ #[ verifier:: exec_allows_no_decreases_clause]
2980+ #[ allow( unreachable_code) ]
2981+ fn test3_fails( a_ref: & mut u64 , c_ref: & mut u64 )
2982+ ensures
2983+ false
2984+ {
2985+ let ct = Ctor ( a_ref, (
2986+ return // FAILS
2987+ ) , c_ref) ;
2988+ }
2989+
2990+ #[ verifier:: exec_allows_no_decreases_clause]
2991+ #[ allow( unreachable_code) ]
2992+ fn test4( ) {
2993+ let mut a = 20 ;
2994+ let mut b = 30 ;
2995+ let mut c = 40 ;
2996+ let ct = Ctor ( & mut a, ( loop { } ) , ( { assert( false ) ; & mut c } ) ) ;
2997+ }
2998+
2999+ #[ verifier:: exec_allows_no_decreases_clause]
3000+ #[ allow( unreachable_code) ]
3001+ fn test5( ) {
3002+ let mut a = 20 ;
3003+ let mut b = 30 ;
3004+ let mut c = 40 ;
3005+ let ct = Ctor ( ( {
3006+ assert( false ) ; // FAILS
3007+ & mut a } ) , ( loop { } ) , & mut c) ;
3008+ }
3009+ } => Err ( e) => assert_fails( e, 2 )
3010+ }
0 commit comments