@@ -2504,15 +2504,16 @@ impl<'source, 'temp> Lowerer<'source, 'temp> {
2504
2504
}
2505
2505
"atomicLoad" => {
2506
2506
let mut args = ctx. prepare_args ( arguments, 1 , span) ;
2507
- let pointer = self . atomic_pointer ( args. next ( ) ?, ctx) ?;
2507
+ let ( pointer, _scalar ) = self . atomic_pointer ( args. next ( ) ?, ctx) ?;
2508
2508
args. finish ( ) ?;
2509
2509
2510
2510
ir:: Expression :: Load { pointer }
2511
2511
}
2512
2512
"atomicStore" => {
2513
2513
let mut args = ctx. prepare_args ( arguments, 2 , span) ;
2514
- let pointer = self . atomic_pointer ( args. next ( ) ?, ctx) ?;
2515
- let value = self . expression ( args. next ( ) ?, ctx) ?;
2514
+ let ( pointer, scalar) = self . atomic_pointer ( args. next ( ) ?, ctx) ?;
2515
+ let value =
2516
+ self . expression_with_leaf_scalar ( args. next ( ) ?, scalar, ctx) ?;
2516
2517
args. finish ( ) ?;
2517
2518
2518
2519
let rctx = ctx. runtime_expression_ctx ( span) ?;
@@ -2526,13 +2527,14 @@ impl<'source, 'temp> Lowerer<'source, 'temp> {
2526
2527
"atomicCompareExchangeWeak" => {
2527
2528
let mut args = ctx. prepare_args ( arguments, 3 , span) ;
2528
2529
2529
- let pointer = self . atomic_pointer ( args. next ( ) ?, ctx) ?;
2530
+ let ( pointer, scalar ) = self . atomic_pointer ( args. next ( ) ?, ctx) ?;
2530
2531
2531
- let compare = self . expression ( args. next ( ) ?, ctx) ?;
2532
+ let compare =
2533
+ self . expression_with_leaf_scalar ( args. next ( ) ?, scalar, ctx) ?;
2532
2534
2533
2535
let value = args. next ( ) ?;
2534
2536
let value_span = ctx. ast_expressions . get_span ( value) ;
2535
- let value = self . expression ( value, ctx) ?;
2537
+ let value = self . expression_with_leaf_scalar ( value, scalar , ctx) ?;
2536
2538
2537
2539
args. finish ( ) ?;
2538
2540
@@ -3200,13 +3202,13 @@ impl<'source, 'temp> Lowerer<'source, 'temp> {
3200
3202
& mut self ,
3201
3203
expr : Handle < ast:: Expression < ' source > > ,
3202
3204
ctx : & mut ExpressionContext < ' source , ' _ , ' _ > ,
3203
- ) -> Result < ' source , Handle < ir:: Expression > > {
3205
+ ) -> Result < ' source , ( Handle < ir:: Expression > , ir :: Scalar ) > {
3204
3206
let span = ctx. ast_expressions . get_span ( expr) ;
3205
3207
let pointer = self . expression ( expr, ctx) ?;
3206
3208
3207
3209
match * resolve_inner ! ( ctx, pointer) {
3208
3210
ir:: TypeInner :: Pointer { base, .. } => match ctx. module . types [ base] . inner {
3209
- ir:: TypeInner :: Atomic { .. } => Ok ( pointer) ,
3211
+ ir:: TypeInner :: Atomic ( scalar ) => Ok ( ( pointer, scalar ) ) ,
3210
3212
ref other => {
3211
3213
log:: error!( "Pointer type to {:?} passed to atomic op" , other) ;
3212
3214
Err ( Box :: new ( Error :: InvalidAtomicPointer ( span) ) )
@@ -3229,8 +3231,8 @@ impl<'source, 'temp> Lowerer<'source, 'temp> {
3229
3231
) -> Result < ' source , Option < Handle < ir:: Expression > > > {
3230
3232
let mut args = ctx. prepare_args ( args, 2 , span) ;
3231
3233
3232
- let pointer = self . atomic_pointer ( args. next ( ) ?, ctx) ?;
3233
- let value = self . expression ( args. next ( ) ?, ctx) ?;
3234
+ let ( pointer, scalar ) = self . atomic_pointer ( args. next ( ) ?, ctx) ?;
3235
+ let value = self . expression_with_leaf_scalar ( args. next ( ) ?, scalar , ctx) ?;
3234
3236
let value_inner = resolve_inner ! ( ctx, value) ;
3235
3237
args. finish ( ) ?;
3236
3238
0 commit comments