@@ -250,15 +250,18 @@ pub trait IndexUnchecked<T> {
250250impl < T > IndexUnchecked < T > for [ T ] {
251251 #[ cfg( target_arch = "spirv" ) ]
252252 unsafe fn index_unchecked ( & self , index : usize ) -> & T {
253- asm ! (
253+ // FIXME(eddyb) `let mut result = T::default()` uses (for `asm!`), with this.
254+ let mut result_slot = core:: mem:: MaybeUninit :: uninit ( ) ;
255+ asm ! {
254256 "%slice_ptr = OpLoad _ {slice_ptr_ptr}" ,
255257 "%data_ptr = OpCompositeExtract _ %slice_ptr 0" ,
256- "%val_ptr = OpAccessChain _ %data_ptr {index}" ,
257- "OpReturnValue %val_ptr " ,
258+ "%result = OpAccessChain _ %data_ptr {index}" ,
259+ "OpStore {result_slot} %result " ,
258260 slice_ptr_ptr = in( reg) & self ,
259261 index = in( reg) index,
260- options( noreturn)
261- )
262+ result_slot = in( reg) result_slot. as_mut_ptr( ) ,
263+ }
264+ result_slot. assume_init ( )
262265 }
263266
264267 #[ cfg( not( target_arch = "spirv" ) ) ]
@@ -268,15 +271,18 @@ impl<T> IndexUnchecked<T> for [T] {
268271
269272 #[ cfg( target_arch = "spirv" ) ]
270273 unsafe fn index_unchecked_mut ( & mut self , index : usize ) -> & mut T {
271- asm ! (
274+ // FIXME(eddyb) `let mut result = T::default()` uses (for `asm!`), with this.
275+ let mut result_slot = core:: mem:: MaybeUninit :: uninit ( ) ;
276+ asm ! {
272277 "%slice_ptr = OpLoad _ {slice_ptr_ptr}" ,
273278 "%data_ptr = OpCompositeExtract _ %slice_ptr 0" ,
274- "%val_ptr = OpAccessChain _ %data_ptr {index}" ,
275- "OpReturnValue %val_ptr " ,
279+ "%result = OpAccessChain _ %data_ptr {index}" ,
280+ "OpStore {result_slot} %result " ,
276281 slice_ptr_ptr = in( reg) & self ,
277282 index = in( reg) index,
278- options( noreturn)
279- )
283+ result_slot = in( reg) result_slot. as_mut_ptr( ) ,
284+ }
285+ result_slot. assume_init ( )
280286 }
281287
282288 #[ cfg( not( target_arch = "spirv" ) ) ]
@@ -288,13 +294,16 @@ impl<T> IndexUnchecked<T> for [T] {
288294impl < T , const N : usize > IndexUnchecked < T > for [ T ; N ] {
289295 #[ cfg( target_arch = "spirv" ) ]
290296 unsafe fn index_unchecked ( & self , index : usize ) -> & T {
291- asm ! (
292- "%val_ptr = OpAccessChain _ {array_ptr} {index}" ,
293- "OpReturnValue %val_ptr" ,
297+ // FIXME(eddyb) `let mut result = T::default()` uses (for `asm!`), with this.
298+ let mut result_slot = core:: mem:: MaybeUninit :: uninit ( ) ;
299+ asm ! {
300+ "%result = OpAccessChain _ {array_ptr} {index}" ,
301+ "OpStore {result_slot} %result" ,
294302 array_ptr = in( reg) self ,
295303 index = in( reg) index,
296- options( noreturn)
297- )
304+ result_slot = in( reg) result_slot. as_mut_ptr( ) ,
305+ }
306+ result_slot. assume_init ( )
298307 }
299308
300309 #[ cfg( not( target_arch = "spirv" ) ) ]
@@ -304,13 +313,16 @@ impl<T, const N: usize> IndexUnchecked<T> for [T; N] {
304313
305314 #[ cfg( target_arch = "spirv" ) ]
306315 unsafe fn index_unchecked_mut ( & mut self , index : usize ) -> & mut T {
307- asm ! (
308- "%val_ptr = OpAccessChain _ {array_ptr} {index}" ,
309- "OpReturnValue %val_ptr" ,
316+ // FIXME(eddyb) `let mut result = T::default()` uses (for `asm!`), with this.
317+ let mut result_slot = core:: mem:: MaybeUninit :: uninit ( ) ;
318+ asm ! {
319+ "%result = OpAccessChain _ {array_ptr} {index}" ,
320+ "OpStore {result_slot} %result" ,
310321 array_ptr = in( reg) self ,
311322 index = in( reg) index,
312- options( noreturn)
313- )
323+ result_slot = in( reg) result_slot. as_mut_ptr( ) ,
324+ }
325+ result_slot. assume_init ( )
314326 }
315327
316328 #[ cfg( not( target_arch = "spirv" ) ) ]
0 commit comments