@@ -77,6 +77,83 @@ pub fn from_switch_2(n: i32) -> i32 {
7777 } ) ;
7878 panic ! ( "ub: non-void function does not return a value" )
7979}
80+ #[ derive( Default ) ]
81+ pub struct wrapper {
82+ pub item : Value < Ptr < i32 > > ,
83+ }
84+ impl Clone for wrapper {
85+ fn clone ( & self ) -> Self {
86+ Self {
87+ item : Rc :: new ( RefCell :: new ( ( * self . item . borrow ( ) ) . clone ( ) ) ) ,
88+ }
89+ }
90+ }
91+ impl ByteRepr for wrapper {
92+ fn byte_size ( ) -> usize {
93+ 8
94+ }
95+ fn to_bytes ( & self , buf : & mut [ u8 ] ) {
96+ ( * self . item . borrow ( ) ) . to_bytes ( & mut buf[ 0 ..8 ] ) ;
97+ }
98+ fn from_bytes ( buf : & [ u8 ] ) -> Self {
99+ Self {
100+ item : Rc :: new ( RefCell :: new ( <Ptr < i32 > >:: from_bytes ( & buf[ 0 ..8 ] ) ) ) ,
101+ }
102+ }
103+ }
104+ pub fn via_pointer_3 ( w : Ptr < wrapper > , fail : i32 ) -> i32 {
105+ let w: Value < Ptr < wrapper > > = Rc :: new ( RefCell :: new ( w) ) ;
106+ let fail: Value < i32 > = Rc :: new ( RefCell :: new ( fail) ) ;
107+ let ret: Value < i32 > = <Value < i32 > >:: default ( ) ;
108+ let item: Value < Ptr < i32 > > = Rc :: new ( RefCell :: new ( Ptr :: < i32 > :: null ( ) ) ) ;
109+ goto_block ! ( {
110+ ' __entry: {
111+ * ret. borrow_mut( ) = 0 ;
112+ * item. borrow_mut( ) = ( * ( * ( * w. borrow( ) ) . upgrade( ) . deref( ) ) . item. borrow( ) ) . clone( ) ;
113+ if ( ( * fail. borrow( ) ) != 0 ) {
114+ ( * ret. borrow_mut( ) ) = -1_i32 ;
115+ goto!( ' out) ;
116+ }
117+ let __rhs = ( ( * item. borrow( ) ) . read( ) ) ;
118+ ( * ret. borrow_mut( ) ) = __rhs;
119+ }
120+ ' out: {
121+ return ( * ret. borrow( ) ) ;
122+ }
123+ } ) ;
124+ panic ! ( "ub: non-void function does not return a value" )
125+ }
126+ pub fn via_arrays_4 ( fail : i32 ) -> i32 {
127+ let fail: Value < i32 > = Rc :: new ( RefCell :: new ( fail) ) ;
128+ let ret: Value < i32 > = <Value < i32 > >:: default ( ) ;
129+ let remain: Value < Box < [ u8 ] > > = Rc :: new ( RefCell :: new (
130+ ( 0 ..4 ) . map ( |_| <u8 >:: default ( ) ) . collect :: < Box < [ u8 ] > > ( ) ,
131+ ) ) ;
132+ let name: Value < Box < [ u8 ] > > = Rc :: new ( RefCell :: new (
133+ ( 0 ..5 ) . map ( |_| <u8 >:: default ( ) ) . collect :: < Box < [ u8 ] > > ( ) ,
134+ ) ) ;
135+ goto_block ! ( {
136+ ' __entry: {
137+ * ret. borrow_mut( ) = 0 ;
138+ * remain. borrow_mut( ) =
139+ Box :: new( [ 0_u8 , <u8 >:: default ( ) , <u8 >:: default ( ) , <u8 >:: default ( ) ] ) ;
140+ * name. borrow_mut( ) = Box :: from( * b"wxyz\0 " ) ;
141+ if ( ( * fail. borrow( ) ) != 0 ) {
142+ ( * ret. borrow_mut( ) ) = -1_i32 ;
143+ goto!( ' out) ;
144+ }
145+ ( * remain. borrow_mut( ) ) [ ( 1 ) as usize ] = 9_u8 ;
146+ ( * ret. borrow_mut( ) ) = ( ( ( ( ( * remain. borrow( ) ) [ ( 0 ) as usize ] as i32 )
147+ + ( ( * remain. borrow( ) ) [ ( 1 ) as usize ] as i32 ) )
148+ + ( ( ( ( * name. borrow( ) ) [ ( 0 ) as usize ] as i32 ) == ( 'w' as i32 ) ) as i32 ) )
149+ + ( ( ( ( * name. borrow( ) ) [ ( 4 ) as usize ] as i32 ) == ( '\0' as i32 ) ) as i32 ) ) ;
150+ }
151+ ' out: {
152+ return ( * ret. borrow( ) ) ;
153+ }
154+ } ) ;
155+ panic ! ( "ub: non-void function does not return a value" )
156+ }
80157pub fn main ( ) {
81158 std:: process:: exit ( main_0 ( ) ) ;
82159}
@@ -87,5 +164,13 @@ fn main_0() -> i32 {
87164 assert ! ( ( ( ( ( { from_loop_1( 10 , ) } ) == 7 ) as i32 ) != 0 ) ) ;
88165 assert ! ( ( ( ( ( { from_switch_2( 1 , ) } ) == 10 ) as i32 ) != 0 ) ) ;
89166 assert ! ( ( ( ( ( { from_switch_2( 2 , ) } ) == 999 ) as i32 ) != 0 ) ) ;
167+ let value: Value < i32 > = Rc :: new ( RefCell :: new ( 42 ) ) ;
168+ let w: Value < wrapper > = Rc :: new ( RefCell :: new ( wrapper {
169+ item : Rc :: new ( RefCell :: new ( ( value. as_pointer ( ) ) ) ) ,
170+ } ) ) ;
171+ assert ! ( ( ( ( ( { via_pointer_3( ( w. as_pointer( ) ) , 0 , ) } ) == 42 ) as i32 ) != 0 ) ) ;
172+ assert ! ( ( ( ( ( { via_pointer_3( ( w. as_pointer( ) ) , 1 , ) } ) == -1_i32 ) as i32 ) != 0 ) ) ;
173+ assert ! ( ( ( ( ( { via_arrays_4( 0 , ) } ) == 11 ) as i32 ) != 0 ) ) ;
174+ assert ! ( ( ( ( ( { via_arrays_4( 1 , ) } ) == -1_i32 ) as i32 ) != 0 ) ) ;
90175 return 0 ;
91176}
0 commit comments