@@ -77,6 +77,52 @@ 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+ }
80126pub fn main ( ) {
81127 std:: process:: exit ( main_0 ( ) ) ;
82128}
@@ -87,5 +133,11 @@ fn main_0() -> i32 {
87133 assert ! ( ( ( ( ( { from_loop_1( 10 , ) } ) == 7 ) as i32 ) != 0 ) ) ;
88134 assert ! ( ( ( ( ( { from_switch_2( 1 , ) } ) == 10 ) as i32 ) != 0 ) ) ;
89135 assert ! ( ( ( ( ( { from_switch_2( 2 , ) } ) == 999 ) as i32 ) != 0 ) ) ;
136+ let value: Value < i32 > = Rc :: new ( RefCell :: new ( 42 ) ) ;
137+ let w: Value < wrapper > = Rc :: new ( RefCell :: new ( wrapper {
138+ item : Rc :: new ( RefCell :: new ( ( value. as_pointer ( ) ) ) ) ,
139+ } ) ) ;
140+ assert ! ( ( ( ( ( { via_pointer_3( ( w. as_pointer( ) ) , 0 , ) } ) == 42 ) as i32 ) != 0 ) ) ;
141+ assert ! ( ( ( ( ( { via_pointer_3( ( w. as_pointer( ) ) , 1 , ) } ) == -1_i32 ) as i32 ) != 0 ) ) ;
90142 return 0 ;
91143}
0 commit comments