@@ -568,7 +568,7 @@ macro_rules! array_field_ptr {
568568
569569// Field `field` of the struct that a Ptr or a Value holds, to make a pointer
570570// to with as_pointer(), e.g., `field_ref!(p, v).as_pointer()` for a vector
571- // field `v`, which gives a pointer to the vector or to its first element .
571+ // field `v`, which gives a pointer to the vector.
572572#[ macro_export]
573573macro_rules! field_ref {
574574 ( $base: expr, $field: ident) => { {
@@ -1006,7 +1006,8 @@ impl<S: Record, T: ByteRepr> VecElem<'_, S, T> {
10061006 let elems: Ptr < T > = self
10071007 . base
10081008 . field_ref ( self . get , self . get_mut , self . offset )
1009- . as_pointer ( ) ;
1009+ . as_pointer ( )
1010+ . decay ( ) ;
10101011 elems. offset ( self . idx ) . upgrade ( )
10111012 }
10121013}
@@ -1561,10 +1562,11 @@ mod tests {
15611562 }
15621563
15631564 #[ test]
1564- #[ should_panic( expected = "too large for a pointer to its elements" ) ]
15651565 fn far_vector_field_ptr ( ) {
1566- let far: Ptr < Far > = field_ptr ! ( holds_far( ) , far) ;
1567- let _: Ptr < i32 > = field_ref ! ( far, v) . as_pointer ( ) ;
1566+ let holder = holds_far ( ) ;
1567+ let far: Ptr < Far > = field_ptr ! ( holder, far) ;
1568+ let v: Ptr < i32 > = field_ref ! ( far, v) . as_pointer ( ) . decay ( ) ;
1569+ assert_eq ! ( v. offset( 1 ) . read( ) , 6 ) ;
15681570 }
15691571
15701572 #[ test]
@@ -1574,7 +1576,7 @@ mod tests {
15741576 let s: Value < Far > = Rc :: new ( RefCell :: new ( holds_far ( ) . borrow ( ) . far . clone ( ) ) ) ;
15751577 let arr: Ptr < i32 > = array_field_ptr ! ( s, arr) ;
15761578 assert_eq ! ( arr. offset( 2 ) . read( ) , 3 ) ;
1577- let v: Ptr < i32 > = field_ref ! ( s, v) . as_pointer ( ) ;
1579+ let v: Ptr < i32 > = field_ref ! ( s, v) . as_pointer ( ) . decay ( ) ;
15781580 assert_eq ! ( v. offset( 1 ) . read( ) , 6 ) ;
15791581 }
15801582
@@ -1623,7 +1625,7 @@ mod tests {
16231625 assert_ne ! ( a. offset( 1 ) , b) ;
16241626 assert_eq ! ( b. offset( -2 ) , a) ;
16251627 // The elements of a vector are not in the struct.
1626- let v: Ptr < i32 > = field_ref ! ( s, v) . as_pointer ( ) ;
1628+ let v: Ptr < i32 > = field_ref ! ( s, v) . as_pointer ( ) . decay ( ) ;
16271629 assert_ne ! ( v. offset( 6 ) , field_ptr!( s, c) ) ;
16281630 }
16291631
0 commit comments