@@ -9,6 +9,31 @@ use std::rc::{Rc, Weak};
99pub fn f_0 ( list : Vec < i32 > ) {
1010 let list: Value < Vec < i32 > > = Rc :: new ( RefCell :: new ( list) ) ;
1111}
12+ #[ derive( Clone , Record , ByteRepr , VaArg , FnPtrArg , Default ) ]
13+ #[ byte_size( 8 ) ]
14+ pub struct Pair {
15+ #[ offset( 0 ) ]
16+ pub a : i32 ,
17+ #[ offset( 4 ) ]
18+ pub b : i32 ,
19+ }
20+ #[ derive( Clone , Record , ByteRepr , VaArg , FnPtrArg ) ]
21+ #[ byte_size( 8 ) ]
22+ pub struct Holder {
23+ #[ offset( 0 ) ]
24+ #[ byte_size( 8 ) ]
25+ pub p : Pair ,
26+ }
27+ impl Default for Holder {
28+ fn default ( ) -> Self {
29+ Holder {
30+ p : Pair { a : 0 , b : 0 } ,
31+ }
32+ }
33+ }
34+ pub fn sum_1 ( p : Ptr < Pair > ) -> i32 {
35+ return ( { p. with ( |__s| __s. a ) } + { p. with ( |__s| __s. b ) } ) ;
36+ }
1237pub fn main ( ) {
1338 __cpp2rust_init_globals ( ) ;
1439 std:: process:: exit ( main_0 ( ) ) ;
@@ -21,6 +46,20 @@ fn main_0() -> i32 {
2146 let arr: Value < Vec < i32 > > = Rc :: new ( RefCell :: new ( vec ! [ 1 , 2 , 3 ] ) ) ;
2247 let mut vec_: Vec < i32 > = vec ! [ 1 , 2 , 3 ] ;
2348 ( { f_0 ( vec ! [ 1 , 2 , 3 , 4 ] ) } ) ;
49+ let p: Value < Pair > = Rc :: new ( RefCell :: new ( Pair { a : 1 , b : 2 } ) ) ;
50+ let h: Value < Holder > = Rc :: new ( RefCell :: new ( <Holder >:: default ( ) ) ) ;
51+ ( { HolderImpl :: operator_assign_1 ( & h. as_pointer ( ) , p. as_pointer ( ) ) } ) ;
52+ assert ! ( ( { ( * h. borrow( ) ) . p. a } == 1 ) && ( { ( * h. borrow( ) ) . p. b } == 2 ) ) ;
53+ assert ! ( ( ( { sum_1( p. as_pointer( ) , ) } ) == 3 ) ) ;
2454 return 0 ;
2555}
56+ pub trait HolderImpl {
57+ fn operator_assign_1 ( & self , o : Ptr < Pair > ) -> Ptr < Holder > ;
58+ }
59+ impl HolderImpl for Ptr < Holder > {
60+ fn operator_assign_1 ( & self , o : Ptr < Pair > ) -> Ptr < Holder > {
61+ field ! ( ( * self ) , p) . write ( { ( * o. upgrade ( ) . deref ( ) ) . clone ( ) } ) ;
62+ return ( * self ) . clone ( ) ;
63+ }
64+ }
2665pub fn __cpp2rust_init_globals ( ) { }
0 commit comments