@@ -77,3 +77,87 @@ fn reserve_does_not_overallocate() {
77
77
assert ! ( v. capacity( ) >= 12 + 12 / 2 ) ;
78
78
}
79
79
}
80
+
81
+ struct ZST ;
82
+
83
+ // A `RawVec` holding zero-sized elements should always look like this.
84
+ fn zst_sanity < T > ( v : & RawVec < T > ) {
85
+ assert_eq ! ( v. capacity( ) , usize :: MAX ) ;
86
+ assert_eq ! ( v. ptr( ) , core:: ptr:: Unique :: <T >:: dangling( ) . as_ptr( ) ) ;
87
+ assert_eq ! ( v. current_memory( ) , None ) ;
88
+ }
89
+
90
+ #[ test]
91
+ fn zst ( ) {
92
+ let cap_err = Err ( crate :: collections:: TryReserveErrorKind :: CapacityOverflow . into ( ) ) ;
93
+
94
+ assert_eq ! ( std:: mem:: size_of:: <ZST >( ) , 0 ) ;
95
+
96
+ // All these different ways of creating the RawVec produce the same thing.
97
+
98
+ let v: RawVec < ZST > = RawVec :: new ( ) ;
99
+ zst_sanity ( & v) ;
100
+
101
+ let v: RawVec < ZST > = RawVec :: with_capacity_in ( 100 , Global ) ;
102
+ zst_sanity ( & v) ;
103
+
104
+ let v: RawVec < ZST > = RawVec :: with_capacity_in ( 100 , Global ) ;
105
+ zst_sanity ( & v) ;
106
+
107
+ let v: RawVec < ZST > = RawVec :: allocate_in ( 0 , AllocInit :: Uninitialized , Global ) ;
108
+ zst_sanity ( & v) ;
109
+
110
+ let v: RawVec < ZST > = RawVec :: allocate_in ( 100 , AllocInit :: Uninitialized , Global ) ;
111
+ zst_sanity ( & v) ;
112
+
113
+ let mut v: RawVec < ZST > = RawVec :: allocate_in ( usize:: MAX , AllocInit :: Uninitialized , Global ) ;
114
+ zst_sanity ( & v) ;
115
+
116
+ // Check all these operations work as expected with zero-sized elements.
117
+
118
+ assert ! ( !v. needs_to_grow( 100 , usize :: MAX - 100 ) ) ;
119
+ assert ! ( v. needs_to_grow( 101 , usize :: MAX - 100 ) ) ;
120
+ zst_sanity ( & v) ;
121
+
122
+ v. reserve ( 100 , usize:: MAX - 100 ) ;
123
+ //v.reserve(101, usize::MAX - 100); // panics, in `zst_reserve_panic` below
124
+ zst_sanity ( & v) ;
125
+
126
+ v. reserve_exact ( 100 , usize:: MAX - 100 ) ;
127
+ //v.reserve_exact(101, usize::MAX - 100); // panics, in `zst_reserve_exact_panic` below
128
+ zst_sanity ( & v) ;
129
+
130
+ assert_eq ! ( v. try_reserve( 100 , usize :: MAX - 100 ) , Ok ( ( ) ) ) ;
131
+ assert_eq ! ( v. try_reserve( 101 , usize :: MAX - 100 ) , cap_err) ;
132
+ zst_sanity ( & v) ;
133
+
134
+ assert_eq ! ( v. try_reserve_exact( 100 , usize :: MAX - 100 ) , Ok ( ( ) ) ) ;
135
+ assert_eq ! ( v. try_reserve_exact( 101 , usize :: MAX - 100 ) , cap_err) ;
136
+ zst_sanity ( & v) ;
137
+
138
+ assert_eq ! ( v. grow_amortized( 100 , usize :: MAX - 100 ) , cap_err) ;
139
+ assert_eq ! ( v. grow_amortized( 101 , usize :: MAX - 100 ) , cap_err) ;
140
+ zst_sanity ( & v) ;
141
+
142
+ assert_eq ! ( v. grow_exact( 100 , usize :: MAX - 100 ) , cap_err) ;
143
+ assert_eq ! ( v. grow_exact( 101 , usize :: MAX - 100 ) , cap_err) ;
144
+ zst_sanity ( & v) ;
145
+ }
146
+
147
+ #[ test]
148
+ #[ should_panic( expected = "capacity overflow" ) ]
149
+ fn zst_reserve_panic ( ) {
150
+ let mut v: RawVec < ZST > = RawVec :: new ( ) ;
151
+ zst_sanity ( & v) ;
152
+
153
+ v. reserve ( 101 , usize:: MAX - 100 ) ;
154
+ }
155
+
156
+ #[ test]
157
+ #[ should_panic( expected = "capacity overflow" ) ]
158
+ fn zst_reserve_exact_panic ( ) {
159
+ let mut v: RawVec < ZST > = RawVec :: new ( ) ;
160
+ zst_sanity ( & v) ;
161
+
162
+ v. reserve_exact ( 101 , usize:: MAX - 100 ) ;
163
+ }
0 commit comments