fortrangoingonforty/armfortas / 2c5aea9

Browse files

Apply rustfmt across runtime, src, and tests

Authored by mfwolffe <wolffemf@dukes.jmu.edu>
SHA
2c5aea94608e112c8ac5ac36c9e283dc8042808b
Parents
81e016f
Tree
09870f3

19 changed files

StatusFile+-
M runtime/src/array.rs 61 39
M runtime/src/io_system.rs 11 4
M src/ast/decl.rs 3 3
M src/codegen/emit.rs 20 4
M src/codegen/isel.rs 5 1
M src/codegen/linearscan.rs 4 1
M src/codegen/relax_branches.rs 3 1
M src/codegen/tailcall.rs 4 1
M src/ir/lower.rs 1343 1340
M src/parser/decl.rs 8 7
M src/parser/stmt.rs 8 2
M src/parser/unit.rs 11 27
M src/sema/amod.rs 17 31
M src/sema/resolve.rs 48 65
M src/sema/symtab.rs 4 6
M src/sema/type_layout.rs 41 30
M src/sema/types.rs 2 7
M tests/cli_driver.rs 93 28
M tests/run_programs.rs 9 3
runtime/src/array.rsmodified
@@ -2054,10 +2054,7 @@ pub extern "C" fn afs_array_size_dim(desc: *const ArrayDescriptor, dim: i32) ->
20542054
 /// `rank`, holding each dimension's extent. Allocates the destination
20552055
 /// via `afs_allocate_array`. F2018 §16.9.207.
20562056
 #[no_mangle]
2057
-pub extern "C" fn afs_array_shape_int4(
2058
-    dst: *mut ArrayDescriptor,
2059
-    src: *const ArrayDescriptor,
2060
-) {
2057
+pub extern "C" fn afs_array_shape_int4(dst: *mut ArrayDescriptor, src: *const ArrayDescriptor) {
20612058
     if dst.is_null() || src.is_null() {
20622059
         return;
20632060
     }
@@ -2080,10 +2077,7 @@ pub extern "C" fn afs_array_shape_int4(
20802077
 
20812078
 /// SHAPE(array, kind=int64) → rank-1 i64 array of extents.
20822079
 #[no_mangle]
2083
-pub extern "C" fn afs_array_shape_int8(
2084
-    dst: *mut ArrayDescriptor,
2085
-    src: *const ArrayDescriptor,
2086
-) {
2080
+pub extern "C" fn afs_array_shape_int8(dst: *mut ArrayDescriptor, src: *const ArrayDescriptor) {
20872081
     if dst.is_null() || src.is_null() {
20882082
         return;
20892083
     }
@@ -2400,22 +2394,30 @@ pub extern "C" fn afs_array_sum_real8_dim(
24002394
     if s.elem_size == 4 {
24012395
         let buf = d.base_addr as *mut f32;
24022396
         for i in 0..dst_total {
2403
-            unsafe { *buf.add(i) = 0.0; }
2397
+            unsafe {
2398
+                *buf.add(i) = 0.0;
2399
+            }
24042400
         }
24052401
         let src_ptr = s.base_addr as *const u8;
24062402
         for_each_reduce_along_dim(s, dim, |byte_off, dst_flat| {
24072403
             let v = unsafe { *(src_ptr.add(byte_off) as *const f32) };
2408
-            unsafe { *buf.add(dst_flat) += v; }
2404
+            unsafe {
2405
+                *buf.add(dst_flat) += v;
2406
+            }
24092407
         });
24102408
     } else {
24112409
         let buf = d.base_addr as *mut f64;
24122410
         for i in 0..dst_total {
2413
-            unsafe { *buf.add(i) = 0.0; }
2411
+            unsafe {
2412
+                *buf.add(i) = 0.0;
2413
+            }
24142414
         }
24152415
         let src_ptr = s.base_addr as *const u8;
24162416
         for_each_reduce_along_dim(s, dim, |byte_off, dst_flat| {
24172417
             let v = unsafe { *(src_ptr.add(byte_off) as *const f64) };
2418
-            unsafe { *buf.add(dst_flat) += v; }
2418
+            unsafe {
2419
+                *buf.add(dst_flat) += v;
2420
+            }
24192421
         });
24202422
     }
24212423
 }
@@ -2474,41 +2476,57 @@ pub extern "C" fn afs_array_sum_int_dim(
24742476
         1 => {
24752477
             let buf = d.base_addr as *mut i8;
24762478
             for i in 0..dst_total {
2477
-                unsafe { *buf.add(i) = 0; }
2479
+                unsafe {
2480
+                    *buf.add(i) = 0;
2481
+                }
24782482
             }
24792483
             for_each_reduce_along_dim(s, dim, |byte_off, dst_flat| {
24802484
                 let v = unsafe { *(src_ptr.add(byte_off) as *const i8) };
2481
-                unsafe { *buf.add(dst_flat) = (*buf.add(dst_flat)).wrapping_add(v); }
2485
+                unsafe {
2486
+                    *buf.add(dst_flat) = (*buf.add(dst_flat)).wrapping_add(v);
2487
+                }
24822488
             });
24832489
         }
24842490
         2 => {
24852491
             let buf = d.base_addr as *mut i16;
24862492
             for i in 0..dst_total {
2487
-                unsafe { *buf.add(i) = 0; }
2493
+                unsafe {
2494
+                    *buf.add(i) = 0;
2495
+                }
24882496
             }
24892497
             for_each_reduce_along_dim(s, dim, |byte_off, dst_flat| {
24902498
                 let v = unsafe { *(src_ptr.add(byte_off) as *const i16) };
2491
-                unsafe { *buf.add(dst_flat) = (*buf.add(dst_flat)).wrapping_add(v); }
2499
+                unsafe {
2500
+                    *buf.add(dst_flat) = (*buf.add(dst_flat)).wrapping_add(v);
2501
+                }
24922502
             });
24932503
         }
24942504
         4 => {
24952505
             let buf = d.base_addr as *mut i32;
24962506
             for i in 0..dst_total {
2497
-                unsafe { *buf.add(i) = 0; }
2507
+                unsafe {
2508
+                    *buf.add(i) = 0;
2509
+                }
24982510
             }
24992511
             for_each_reduce_along_dim(s, dim, |byte_off, dst_flat| {
25002512
                 let v = unsafe { *(src_ptr.add(byte_off) as *const i32) };
2501
-                unsafe { *buf.add(dst_flat) = (*buf.add(dst_flat)).wrapping_add(v); }
2513
+                unsafe {
2514
+                    *buf.add(dst_flat) = (*buf.add(dst_flat)).wrapping_add(v);
2515
+                }
25022516
             });
25032517
         }
25042518
         _ => {
25052519
             let buf = d.base_addr as *mut i64;
25062520
             for i in 0..dst_total {
2507
-                unsafe { *buf.add(i) = 0; }
2521
+                unsafe {
2522
+                    *buf.add(i) = 0;
2523
+                }
25082524
             }
25092525
             for_each_reduce_along_dim(s, dim, |byte_off, dst_flat| {
25102526
                 let v = unsafe { *(src_ptr.add(byte_off) as *const i64) };
2511
-                unsafe { *buf.add(dst_flat) = (*buf.add(dst_flat)).wrapping_add(v); }
2527
+                unsafe {
2528
+                    *buf.add(dst_flat) = (*buf.add(dst_flat)).wrapping_add(v);
2529
+                }
25122530
             });
25132531
         }
25142532
     }
@@ -3707,13 +3725,7 @@ pub extern "C" fn afs_transpose_int(source: *const ArrayDescriptor, result: *mut
37073725
         stride: 1,
37083726
     };
37093727
     let dims = [dim0, dim1];
3710
-    afs_allocate_array(
3711
-        result,
3712
-        elem_size as i64,
3713
-        2,
3714
-        dims.as_ptr(),
3715
-        ptr::null_mut(),
3716
-    );
3728
+    afs_allocate_array(result, elem_size as i64, 2, dims.as_ptr(), ptr::null_mut());
37173729
     let res = unsafe { &mut *result };
37183730
     let rp = res.base_addr;
37193731
 
@@ -3733,10 +3745,7 @@ pub extern "C" fn afs_transpose_int(source: *const ArrayDescriptor, result: *mut
37333745
 /// Handles complex(sp) (8-byte) and complex(dp) (16-byte) by reading the
37343746
 /// per-element width from the descriptor.
37353747
 #[no_mangle]
3736
-pub extern "C" fn afs_array_conjg(
3737
-    source: *const ArrayDescriptor,
3738
-    result: *mut ArrayDescriptor,
3739
-) {
3748
+pub extern "C" fn afs_array_conjg(source: *const ArrayDescriptor, result: *mut ArrayDescriptor) {
37403749
     if source.is_null() || result.is_null() {
37413750
         return;
37423751
     }
@@ -3790,10 +3799,7 @@ pub extern "C" fn afs_array_conjg(
37903799
 /// 16B → real(dp) 8B), so we allocate fresh dims rather than using
37913800
 /// `afs_allocate_like`.
37923801
 #[no_mangle]
3793
-pub extern "C" fn afs_array_aimag(
3794
-    source: *const ArrayDescriptor,
3795
-    result: *mut ArrayDescriptor,
3796
-) {
3802
+pub extern "C" fn afs_array_aimag(source: *const ArrayDescriptor, result: *mut ArrayDescriptor) {
37973803
     if source.is_null() || result.is_null() {
37983804
         return;
37993805
     }
@@ -3811,7 +3817,11 @@ pub extern "C" fn afs_array_aimag(
38113817
             stride: 1,
38123818
         };
38133819
     }
3814
-    let dims_ptr = if src.rank > 0 { dims.as_ptr() } else { ptr::null() };
3820
+    let dims_ptr = if src.rank > 0 {
3821
+        dims.as_ptr()
3822
+    } else {
3823
+        ptr::null()
3824
+    };
38153825
     afs_allocate_array(result, lane as i64, src.rank, dims_ptr, ptr::null_mut());
38163826
 
38173827
     let res = unsafe { &mut *result };
@@ -3860,7 +3870,11 @@ pub extern "C" fn afs_array_abs_complex(
38603870
             stride: 1,
38613871
         };
38623872
     }
3863
-    let dims_ptr = if src.rank > 0 { dims.as_ptr() } else { ptr::null() };
3873
+    let dims_ptr = if src.rank > 0 {
3874
+        dims.as_ptr()
3875
+    } else {
3876
+        ptr::null()
3877
+    };
38643878
     afs_allocate_array(result, lane as i64, src.rank, dims_ptr, ptr::null_mut());
38653879
 
38663880
     let res = unsafe { &mut *result };
@@ -3913,7 +3927,11 @@ pub extern "C" fn afs_array_cmplx(
39133927
         None
39143928
     } else {
39153929
         let im = unsafe { &*im_source };
3916
-        if im.base_addr.is_null() { None } else { Some(im) }
3930
+        if im.base_addr.is_null() {
3931
+            None
3932
+        } else {
3933
+            Some(im)
3934
+        }
39173935
     };
39183936
     let lane = out_lane_bytes.max(4) as usize;
39193937
     let elem_size = 2 * lane;
@@ -3925,7 +3943,11 @@ pub extern "C" fn afs_array_cmplx(
39253943
             stride: 1,
39263944
         };
39273945
     }
3928
-    let dims_ptr = if re.rank > 0 { dims.as_ptr() } else { ptr::null() };
3946
+    let dims_ptr = if re.rank > 0 {
3947
+        dims.as_ptr()
3948
+    } else {
3949
+        ptr::null()
3950
+    };
39293951
     afs_allocate_array(result, elem_size as i64, re.rank, dims_ptr, ptr::null_mut());
39303952
 
39313953
     let res = unsafe { &mut *result };
runtime/src/io_system.rsmodified
@@ -29,9 +29,12 @@ fn scratch_filename(unit: i32) -> String {
2929
     let seq = SEQ.fetch_add(1, Ordering::Relaxed);
3030
     let pid = std::process::id();
3131
     let dir = std::env::temp_dir();
32
-    dir.join(format!("afs_scratch_{pid}_{}_{seq}.tmp", unit.unsigned_abs()))
33
-        .to_string_lossy()
34
-        .into_owned()
32
+    dir.join(format!(
33
+        "afs_scratch_{pid}_{}_{seq}.tmp",
34
+        unit.unsigned_abs()
35
+    ))
36
+    .to_string_lossy()
37
+    .into_owned()
3538
 }
3639
 
3740
 #[inline]
@@ -669,7 +672,11 @@ pub extern "C" fn afs_close_ex(unit: i32, status: *const u8, status_len: i64, io
669672
         } else if close_status != 0 {
670673
             // Release lock before exit (afs_io_finalize atexit re-locks). See afs_open.
671674
             drop(state);
672
-            eprintln!("CLOSE: {}: {}", filename, io::Error::from_raw_os_error(close_status));
675
+            eprintln!(
676
+                "CLOSE: {}: {}",
677
+                filename,
678
+                io::Error::from_raw_os_error(close_status)
679
+            );
673680
             std::process::exit(1);
674681
         }
675682
     } else {
src/ast/decl.rsmodified
@@ -206,9 +206,9 @@ pub enum TypeAttr {
206206
 pub struct TypeBoundProc {
207207
     pub name: String,
208208
     pub interface: Option<String>, // procedure(iface) :: name
209
-    pub binding: Option<String>, // procedure :: name => binding
210
-    pub bindings: Vec<String>, // generic :: name => specific_a, specific_b
211
-    pub attrs: Vec<String>,      // pass, nopass, deferred, etc.
209
+    pub binding: Option<String>,   // procedure :: name => binding
210
+    pub bindings: Vec<String>,     // generic :: name => specific_a, specific_b
211
+    pub attrs: Vec<String>,        // pass, nopass, deferred, etc.
212212
     pub is_generic: bool,
213213
 }
214214
 
src/codegen/emit.rsmodified
@@ -754,17 +754,33 @@ fn emit_inst(inst: &MachineInst, mf: &MachineFunction) -> String {
754754
             if dest_is_gp && src_is_fp {
755755
                 // GPR ← FPR: pick GPR width to match FPR (s→w, d→x).
756756
                 let gp = if src.starts_with('d') {
757
-                    if dest_is_x { dest.clone() } else { format!("x{}", &dest[1..]) }
757
+                    if dest_is_x {
758
+                        dest.clone()
759
+                    } else {
760
+                        format!("x{}", &dest[1..])
761
+                    }
758762
                 } else {
759
-                    if dest_is_w { dest.clone() } else { format!("w{}", &dest[1..]) }
763
+                    if dest_is_w {
764
+                        dest.clone()
765
+                    } else {
766
+                        format!("w{}", &dest[1..])
767
+                    }
760768
                 };
761769
                 return format!("fmov {}, {}", gp, src);
762770
             }
763771
             if dest_is_fp && src_is_gp {
764772
                 let gp = if dest.starts_with('d') {
765
-                    if src_is_x { src.clone() } else { format!("x{}", &src[1..]) }
773
+                    if src_is_x {
774
+                        src.clone()
775
+                    } else {
776
+                        format!("x{}", &src[1..])
777
+                    }
766778
                 } else {
767
-                    if src_is_w { src.clone() } else { format!("w{}", &src[1..]) }
779
+                    if src_is_w {
780
+                        src.clone()
781
+                    } else {
782
+                        format!("w{}", &src[1..])
783
+                    }
768784
                 };
769785
                 return format!("fmov {}, {}", dest, gp);
770786
             }
src/codegen/isel.rsmodified
@@ -3305,7 +3305,11 @@ mod tests {
33053305
 
33063306
             b.set_block(def_block);
33073307
             let slot = b.alloca(IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))));
3308
-            b.call(FuncRef::External("_callee".into()), vec![slot], IrType::Void);
3308
+            b.call(
3309
+                FuncRef::External("_callee".into()),
3310
+                vec![slot],
3311
+                IrType::Void,
3312
+            );
33093313
             b.branch(use_block, vec![]);
33103314
         }
33113315
 
src/codegen/linearscan.rsmodified
@@ -686,7 +686,10 @@ fn rewrite_call_arg_copies(pending_moves: Vec<MachineInst>) -> Vec<MachineInst>
686686
         let scratch = scratch_phys_for(src);
687687
         rewritten.push(MachineInst {
688688
             opcode: move_opcode_for_phys(src),
689
-            operands: vec![MachineOperand::PhysReg(scratch), MachineOperand::PhysReg(src)],
689
+            operands: vec![
690
+                MachineOperand::PhysReg(scratch),
691
+                MachineOperand::PhysReg(src),
692
+            ],
690693
             def: None,
691694
         });
692695
         pending[0].2 = scratch;
src/codegen/relax_branches.rsmodified
@@ -32,7 +32,9 @@
3232
 //! function body larger than 128MB.
3333
 
3434
 use super::emit::emit_inst_text;
35
-use super::mir::{ArmCond, ArmOpcode, MBlockId, MachineBlock, MachineFunction, MachineInst, MachineOperand};
35
+use super::mir::{
36
+    ArmCond, ArmOpcode, MBlockId, MachineBlock, MachineFunction, MachineInst, MachineOperand,
37
+};
3638
 
3739
 /// Maximum signed offset (in bytes) reachable by a `B.cond`. The
3840
 /// 19-bit signed immediate is scaled by 4, giving ±(2^20) bytes.
src/codegen/tailcall.rsmodified
@@ -549,7 +549,10 @@ mod tests {
549549
             "tail-call optimization must not erase the call when an arg reloads a spilled frame pointer"
550550
         );
551551
         assert!(
552
-            mf.blocks[0].insts.iter().any(|i| i.opcode == ArmOpcode::Ret),
552
+            mf.blocks[0]
553
+                .insts
554
+                .iter()
555
+                .any(|i| i.opcode == ArmOpcode::Ret),
553556
             "tail-call optimization must leave the normal return path intact"
554557
         );
555558
     }
src/ir/lower.rsmodified
4443 lines changed — click to load
@@ -326,7 +326,7 @@ impl<'a> LowerCtx<'a> {
326326
                 is_pointer: false,
327327
                 runtime_dim_upper: vec![],
328328
                 is_class: false,
329
-            logical_kind: None,
329
+                logical_kind: None,
330330
                 last_dim_assumed_size: false,
331331
             },
332332
         );
@@ -348,7 +348,7 @@ impl<'a> LowerCtx<'a> {
348348
                 is_pointer: false,
349349
                 runtime_dim_upper: vec![],
350350
                 is_class: false,
351
-            logical_kind: None,
351
+                logical_kind: None,
352352
                 last_dim_assumed_size: false,
353353
             },
354354
         );
@@ -671,7 +671,10 @@ fn collect_local_owner_modules(units: &[SpannedUnit]) -> HashSet<String> {
671671
     out
672672
 }
673673
 
674
-fn bound_proc_target_is_local_to_owner(layout: &crate::sema::type_layout::TypeLayout, target: &str) -> bool {
674
+fn bound_proc_target_is_local_to_owner(
675
+    layout: &crate::sema::type_layout::TypeLayout,
676
+    target: &str,
677
+) -> bool {
675678
     let Some(owner) = layout.owner_module.as_ref() else {
676679
         return false;
677680
     };
@@ -688,8 +691,11 @@ fn emit_type_bound_lookup_thunks(
688691
     internal_funcs: &HashMap<String, u32>,
689692
 ) {
690693
     let local_modules = collect_local_owner_modules(units);
691
-    let available_targets: HashSet<String> =
692
-        module.functions.iter().map(|func| func.name.clone()).collect();
694
+    let available_targets: HashSet<String> = module
695
+        .functions
696
+        .iter()
697
+        .map(|func| func.name.clone())
698
+        .collect();
693699
     let mut layouts: Vec<_> = type_layouts
694700
         .layouts
695701
         .values()
@@ -746,12 +752,12 @@ fn emit_type_bound_lookup_thunks(
746752
                 } else {
747753
                     None
748754
                 };
749
-                let target_is_external_inherited =
750
-                    !layout.is_abstract
751
-                        && !bound_proc_target_is_local_to_owner(layout, &bp.target_name);
755
+                let target_is_external_inherited = !layout.is_abstract
756
+                    && !bound_proc_target_is_local_to_owner(layout, &bp.target_name);
752757
                 let addr = if let Some(local_target) = local_target {
753758
                     b.global_addr(&local_target, IrType::Int(IntWidth::I8))
754
-                } else if available_targets.contains(&bp.target_name) || target_is_external_inherited
759
+                } else if available_targets.contains(&bp.target_name)
760
+                    || target_is_external_inherited
755761
                 {
756762
                     b.global_addr(&bp.target_name, IrType::Int(IntWidth::I8))
757763
                 } else {
@@ -1032,7 +1038,10 @@ fn function_hidden_result_abi(
10321038
     // Without this, codegen emits `load %0; ret aggregate` and packs the
10331039
     // 8 bytes into x0 — caller treats x0 as ptr and memcpy's from it,
10341040
     // dereferencing the bit pattern of the complex value as an address.
1035
-    if matches!(return_type, Some(TypeSpec::Complex(_)) | Some(TypeSpec::DoubleComplex)) {
1041
+    if matches!(
1042
+        return_type,
1043
+        Some(TypeSpec::Complex(_)) | Some(TypeSpec::DoubleComplex)
1044
+    ) {
10361045
         return HiddenResultAbi::ComplexBuffer;
10371046
     }
10381047
     HiddenResultAbi::None
@@ -1396,8 +1405,7 @@ fn arg_uses_descriptor_from_decls(arg_name: &str, decls: &[crate::ast::decl::Spa
13961405
                     );
13971406
                     return !is_deferred_char_scalar;
13981407
                 }
1399
-                if specs.is_none()
1400
-                    && matches!(type_spec, TypeSpec::Class(_) | TypeSpec::ClassStar)
1408
+                if specs.is_none() && matches!(type_spec, TypeSpec::Class(_) | TypeSpec::ClassStar)
14011409
                 {
14021410
                     // Scalar polymorphic dummies (`class(name)` and the
14031411
                     // unlimited `class(*)`) are passed by descriptor —
@@ -1513,7 +1521,7 @@ fn procedure_scope_for_dummy_args_with_host(
15131521
                 && scope_matches_procedure_name(scope, proc_name)
15141522
                 && scope_has_linkable_parent(st, idx)
15151523
                 && scope.arg_order == expected_args)
1516
-            .then_some(idx)
1524
+                .then_some(idx)
15171525
         });
15181526
         if scoped.is_some() {
15191527
             return scoped;
@@ -1603,9 +1611,7 @@ fn smp_parent_interface_scope(
16031611
     let proc_lc = proc_name.to_lowercase();
16041612
     st.all_scopes().iter().enumerate().find_map(|(idx, scope)| {
16051613
         let matches_name = match &scope.kind {
1606
-            ScopeKind::Function(n) | ScopeKind::Subroutine(n) => {
1607
-                n.eq_ignore_ascii_case(&proc_lc)
1608
-            }
1614
+            ScopeKind::Function(n) | ScopeKind::Subroutine(n) => n.eq_ignore_ascii_case(&proc_lc),
16091615
             _ => return None,
16101616
         };
16111617
         if !matches_name {
@@ -1764,8 +1770,7 @@ fn smp_function_result_info(
17641770
         }
17651771
         if matches!(
17661772
             sym.kind,
1767
-            crate::sema::symtab::SymbolKind::Variable
1768
-                | crate::sema::symtab::SymbolKind::Parameter
1773
+            crate::sema::symtab::SymbolKind::Variable | crate::sema::symtab::SymbolKind::Parameter
17691774
         ) {
17701775
             let name = sym
17711776
                 .name
@@ -1836,9 +1841,9 @@ fn try_synth_smp_function_unit(
18361841
             Some(result_sym.attrs.array_spec.clone())
18371842
         };
18381843
         let result_char_len = match result_sym.type_info.as_ref() {
1839
-            Some(crate::sema::symtab::TypeInfo::Character { len: Some(n), .. }) => Some(
1840
-                crate::ast::decl::LenSpec::Expr(synth_int_literal_expr(*n)),
1841
-            ),
1844
+            Some(crate::sema::symtab::TypeInfo::Character { len: Some(n), .. }) => {
1845
+                Some(crate::ast::decl::LenSpec::Expr(synth_int_literal_expr(*n)))
1846
+            }
18421847
             Some(crate::sema::symtab::TypeInfo::Character { len: None, .. }) => {
18431848
                 Some(crate::ast::decl::LenSpec::Star)
18441849
             }
@@ -1928,9 +1933,9 @@ fn synthesize_smp_body_args_decls(
19281933
             Some(sym.attrs.array_spec.clone())
19291934
         };
19301935
         let char_len = match sym.type_info.as_ref() {
1931
-            Some(crate::sema::symtab::TypeInfo::Character { len: Some(n), .. }) => Some(
1932
-                crate::ast::decl::LenSpec::Expr(synth_int_literal_expr(*n)),
1933
-            ),
1936
+            Some(crate::sema::symtab::TypeInfo::Character { len: Some(n), .. }) => {
1937
+                Some(crate::ast::decl::LenSpec::Expr(synth_int_literal_expr(*n)))
1938
+            }
19341939
             Some(crate::sema::symtab::TypeInfo::Character { len: None, .. }) => {
19351940
                 Some(crate::ast::decl::LenSpec::Star)
19361941
             }
@@ -1979,8 +1984,7 @@ fn arg_uses_descriptor_for_lowering(
19791984
         .is_some_and(|type_info| {
19801985
             matches!(
19811986
                 type_info,
1982
-                crate::sema::symtab::TypeInfo::Class(_)
1983
-                    | crate::sema::symtab::TypeInfo::ClassStar
1987
+                crate::sema::symtab::TypeInfo::Class(_) | crate::sema::symtab::TypeInfo::ClassStar
19841988
             )
19851989
         })
19861990
 }
@@ -2293,7 +2297,7 @@ fn install_common_locals(
22932297
                         is_pointer: false,
22942298
                         runtime_dim_upper: vec![],
22952299
                         is_class: false,
2296
-            logical_kind: None,
2300
+                        logical_kind: None,
22972301
                         last_dim_assumed_size: false,
22982302
                     },
22992303
                 );
@@ -2349,7 +2353,7 @@ fn install_equivalence_locals(
23492353
                     name: String,
23502354
                     elem_ty: IrType,
23512355
                     dims: Vec<(i64, i64)>,
2352
-                    byte_off: i64, // anchor offset within this variable
2356
+                    byte_off: i64,  // anchor offset within this variable
23532357
                     byte_size: i64, // full byte span of this variable
23542358
                 }
23552359
                 let mut members: Vec<Member> = Vec::new();
@@ -2360,12 +2364,11 @@ fn install_equivalence_locals(
23602364
                             let ty = arg_type_from_decls(&key, decls, Some(st));
23612365
                             let dims = arg_dims_from_decls(&key, decls, visible_param_consts, st);
23622366
                             let elem_size = ir_scalar_byte_size(&ty);
2363
-                            let nelems: i64 =
2364
-                                if dims.is_empty() {
2365
-                                    1
2366
-                                } else {
2367
-                                    dims.iter().map(|(_, ext)| (*ext).max(0)).product()
2368
-                                };
2367
+                            let nelems: i64 = if dims.is_empty() {
2368
+                                1
2369
+                            } else {
2370
+                                dims.iter().map(|(_, ext)| (*ext).max(0)).product()
2371
+                            };
23692372
                             let byte_size = elem_size * nelems.max(1);
23702373
                             members.push(Member {
23712374
                                 name: key,
@@ -2397,10 +2400,7 @@ fn install_equivalence_locals(
23972400
                                     };
23982401
                                     match s {
23992402
                                         Some(v) => {
2400
-                                            let (lo, ext) = dims
2401
-                                                .get(i)
2402
-                                                .copied()
2403
-                                                .unwrap_or((1, 1));
2403
+                                            let (lo, ext) = dims.get(i).copied().unwrap_or((1, 1));
24042404
                                             linear += (v - lo) * stride;
24052405
                                             stride *= ext.max(1);
24062406
                                         }
@@ -2480,7 +2480,7 @@ fn install_equivalence_locals(
24802480
                             is_pointer: false,
24812481
                             runtime_dim_upper: vec![None; m.dims.len()],
24822482
                             is_class: false,
2483
-            logical_kind: None,
2483
+                            logical_kind: None,
24842484
                             last_dim_assumed_size: false,
24852485
                         },
24862486
                     );
@@ -2879,14 +2879,8 @@ fn collect_host_refs_stmt(
28792879
         Stmt::Return { value: Some(e) } | Stmt::ComputedGoto { selector: e, .. } => {
28802880
             collect_host_refs_expr(e, host_names, sub_locals, refs);
28812881
         }
2882
-        Stmt::Stop {
2883
-            code: Some(e),
2884
-            ..
2885
-        }
2886
-        | Stmt::ErrorStop {
2887
-            code: Some(e),
2888
-            ..
2889
-        }
2882
+        Stmt::Stop { code: Some(e), .. }
2883
+        | Stmt::ErrorStop { code: Some(e), .. }
28902884
         | Stmt::ArithmeticIf { expr: e, .. } => {
28912885
             collect_host_refs_expr(e, host_names, sub_locals, refs);
28922886
         }
@@ -3082,7 +3076,7 @@ fn collect_implicit_locals(
30823076
                         is_pointer: false,
30833077
                         runtime_dim_upper: vec![],
30843078
                         is_class: false,
3085
-            logical_kind: None,
3079
+                        logical_kind: None,
30863080
                         last_dim_assumed_size: false,
30873081
                     },
30883082
                 );
@@ -3702,7 +3696,7 @@ fn collect_module_globals(
37023696
                                 derived_type: derived_type_name.clone(),
37033697
                                 char_kind: global_char_kind.clone(),
37043698
                                 external: false,
3705
-                            private: false,
3699
+                                private: false,
37063700
                             },
37073701
                         );
37083702
                         continue;
@@ -3711,7 +3705,12 @@ fn collect_module_globals(
37113705
                         if let Some(len) = char_len {
37123706
                             let storage_ty = fixed_char_storage_ir_type(len);
37133707
                             let init = init_expr.and_then(|e| {
3714
-                                eval_const_char_global_init(e, &param_consts, &param_char_consts, len)
3708
+                                eval_const_char_global_init(
3709
+                                    e,
3710
+                                    &param_consts,
3711
+                                    &param_char_consts,
3712
+                                    len,
3713
+                                )
37153714
                             });
37163715
                             module.add_global(Global {
37173716
                                 name: symbol.clone(),
@@ -3730,7 +3729,7 @@ fn collect_module_globals(
37303729
                                     derived_type: None,
37313730
                                     char_kind: CharKind::Fixed(len),
37323731
                                     external: false,
3733
-                            private: false,
3732
+                                    private: false,
37343733
                                 },
37353734
                             );
37363735
                             continue;
@@ -3777,7 +3776,7 @@ fn collect_module_globals(
37773776
                                     derived_type: Some(type_name.clone()),
37783777
                                     char_kind: CharKind::None,
37793778
                                     external: false,
3780
-                            private: false,
3779
+                                    private: false,
37813780
                                 },
37823781
                             );
37833782
                             continue;
@@ -4066,16 +4065,15 @@ fn lower_unit(
40664065
             );
40674066
             ctx.proc_scope_id = {
40684067
                 let raw_name = name.as_deref();
4069
-                st.all_scopes()
4070
-                    .iter()
4071
-                    .enumerate()
4072
-                    .find_map(|(idx, scope)| match (&scope.kind, raw_name) {
4068
+                st.all_scopes().iter().enumerate().find_map(|(idx, scope)| {
4069
+                    match (&scope.kind, raw_name) {
40734070
                         (crate::sema::symtab::ScopeKind::Program(scope_name), Some(n)) => {
40744071
                             scope_name.eq_ignore_ascii_case(n).then_some(idx)
40754072
                         }
40764073
                         (crate::sema::symtab::ScopeKind::Program(_), None) => Some(idx),
40774074
                         _ => None,
4078
-                    })
4075
+                    }
4076
+                })
40794077
             };
40804078
             let mut pending_globals: Vec<PendingGlobal> = Vec::new();
40814079
 
@@ -4086,7 +4084,13 @@ fn lower_unit(
40864084
             {
40874085
                 let mut b = FuncBuilder::new(&mut func);
40884086
                 install_common_locals(&mut b, &mut ctx.locals, decls);
4089
-                install_equivalence_locals(&mut b, &mut ctx.locals, decls, &visible_param_consts, st);
4087
+                install_equivalence_locals(
4088
+                    &mut b,
4089
+                    &mut ctx.locals,
4090
+                    decls,
4091
+                    &visible_param_consts,
4092
+                    st,
4093
+                );
40904094
                 alloc_decls(
40914095
                     &mut b,
40924096
                     &mut ctx.locals,
@@ -4394,12 +4398,8 @@ fn lower_unit(
43944398
                         b.store(*pid, slot);
43954399
                         ctx.insert_scalar(pname.clone(), slot, elem_ty.clone());
43964400
                     } else {
4397
-                        let uses_descriptor = arg_uses_descriptor_for_lowering(
4398
-                            pname,
4399
-                            decls,
4400
-                            st,
4401
-                            proc_scope_id,
4402
-                        );
4401
+                        let uses_descriptor =
4402
+                            arg_uses_descriptor_for_lowering(pname, decls, st, proc_scope_id);
44034403
                         let uses_string_descriptor =
44044404
                             arg_uses_string_descriptor_from_decls(pname, decls);
44054405
                         let dt_name = arg_derived_type_name(pname, decls);
@@ -4442,7 +4442,9 @@ fn lower_unit(
44424442
                                 Some(&visible_param_consts),
44434443
                                 st,
44444444
                             ),
4445
-                            last_dim_assumed_size: arg_last_dim_assumed_size_from_decls(pname, decls),
4445
+                            last_dim_assumed_size: arg_last_dim_assumed_size_from_decls(
4446
+                                pname, decls,
4447
+                            ),
44464448
                         };
44474449
                         ctx.locals.insert(pname.clone(), info);
44484450
                         if decl_is_optional(pname, decls) {
@@ -4515,7 +4517,13 @@ fn lower_unit(
45154517
                 );
45164518
 
45174519
                 install_common_locals(&mut b, &mut ctx.locals, decls);
4518
-                install_equivalence_locals(&mut b, &mut ctx.locals, decls, &visible_param_consts, st);
4520
+                install_equivalence_locals(
4521
+                    &mut b,
4522
+                    &mut ctx.locals,
4523
+                    decls,
4524
+                    &visible_param_consts,
4525
+                    st,
4526
+                );
45194527
                 // Install host-association by_ref locals before alloc_decls
45204528
                 // so any same-named callee local (shouldn't occur per F
45214529
                 // scoping rules) is short-circuited, and so init_decls has
@@ -4650,18 +4658,24 @@ fn lower_unit(
46504658
                     HiddenResultAbi::ArrayDescriptor => 384,
46514659
                     HiddenResultAbi::StringDescriptor => 32,
46524660
                     HiddenResultAbi::DerivedAggregate => {
4653
-                        let result_name = result
4654
-                            .as_deref()
4655
-                            .unwrap_or(name.as_str())
4656
-                            .to_lowercase();
4661
+                        let result_name = result.as_deref().unwrap_or(name.as_str()).to_lowercase();
46574662
                         derived_type_name_for_result_var(return_type, &result_name, decls)
4658
-                            .and_then(|dt_name| type_layouts.get(&dt_name).map(|layout| layout.size.max(1) as u64))
4663
+                            .and_then(|dt_name| {
4664
+                                type_layouts
4665
+                                    .get(&dt_name)
4666
+                                    .map(|layout| layout.size.max(1) as u64)
4667
+                            })
46594668
                             .unwrap_or(8)
46604669
                     }
46614670
                     HiddenResultAbi::ComplexBuffer => {
46624671
                         // 8 bytes for complex(sp), 16 for complex(dp).
4663
-                        let kind = complex_result_kind(name, result, return_type.as_ref(), decls, st);
4664
-                        if kind == 8 { 16 } else { 8 }
4672
+                        let kind =
4673
+                            complex_result_kind(name, result, return_type.as_ref(), decls, st);
4674
+                        if kind == 8 {
4675
+                            16
4676
+                        } else {
4677
+                            8
4678
+                        }
46654679
                     }
46664680
                     HiddenResultAbi::None => 0,
46674681
                 };
@@ -4867,12 +4881,8 @@ fn lower_unit(
48674881
                         b.store(*pid, slot);
48684882
                         ctx.insert_scalar(pname.clone(), slot, elem_ty.clone());
48694883
                     } else {
4870
-                        let uses_descriptor = arg_uses_descriptor_for_lowering(
4871
-                            pname,
4872
-                            decls,
4873
-                            st,
4874
-                            proc_scope_id,
4875
-                        );
4884
+                        let uses_descriptor =
4885
+                            arg_uses_descriptor_for_lowering(pname, decls, st, proc_scope_id);
48764886
                         let uses_string_descriptor =
48774887
                             arg_uses_string_descriptor_from_decls(pname, decls);
48784888
                         let dt_name = arg_derived_type_name(pname, decls);
@@ -4916,7 +4926,9 @@ fn lower_unit(
49164926
                                     Some(&visible_param_consts),
49174927
                                     st,
49184928
                                 ),
4919
-                                last_dim_assumed_size: arg_last_dim_assumed_size_from_decls(pname, decls),
4929
+                                last_dim_assumed_size: arg_last_dim_assumed_size_from_decls(
4930
+                                    pname, decls,
4931
+                                ),
49204932
                             },
49214933
                         );
49224934
                         if decl_is_optional(pname, decls) {
@@ -5009,17 +5021,14 @@ fn lower_unit(
50095021
                             is_pointer: false,
50105022
                             runtime_dim_upper: vec![],
50115023
                             is_class: false,
5012
-            logical_kind: None,
5024
+                            logical_kind: None,
50135025
                             last_dim_assumed_size: false,
50145026
                         },
50155027
                     );
50165028
                 } else if hidden_result_abi == HiddenResultAbi::DerivedAggregate {
5017
-                    let dt_name = derived_type_name_for_result_var(
5018
-                        return_type,
5019
-                        &result_name,
5020
-                        decls,
5021
-                    )
5022
-                    .expect("derived hidden-result function missing result type");
5029
+                    let dt_name =
5030
+                        derived_type_name_for_result_var(return_type, &result_name, decls)
5031
+                            .expect("derived hidden-result function missing result type");
50235032
                     if let Some(layout) = type_layouts.get(&dt_name) {
50245033
                         if derived_layout_needs_runtime_initialization(layout, type_layouts) {
50255034
                             initialize_derived_storage(&mut b, ValueId(0), layout, type_layouts);
@@ -5040,7 +5049,7 @@ fn lower_unit(
50405049
                             is_pointer: false,
50415050
                             runtime_dim_upper: vec![],
50425051
                             is_class: false,
5043
-            logical_kind: None,
5052
+                            logical_kind: None,
50445053
                             last_dim_assumed_size: false,
50455054
                         },
50465055
                     );
@@ -5063,9 +5072,12 @@ fn lower_unit(
50635072
                     // produces the typed view without changing the runtime
50645073
                     // address.
50655074
                     let kind = complex_result_kind(name, result, return_type.as_ref(), decls, st);
5066
-                    let fw = if kind == 8 { FloatWidth::F64 } else { FloatWidth::F32 };
5067
-                    let cplx_ty =
5068
-                        IrType::Array(Box::new(IrType::Float(fw)), 2);
5075
+                    let fw = if kind == 8 {
5076
+                        FloatWidth::F64
5077
+                    } else {
5078
+                        FloatWidth::F32
5079
+                    };
5080
+                    let cplx_ty = IrType::Array(Box::new(IrType::Float(fw)), 2);
50695081
                     let zero_off = b.const_i64(0);
50705082
                     let typed_addr = b.gep(ValueId(0), vec![zero_off], cplx_ty.clone());
50715083
                     ctx.locals.insert(
@@ -5126,7 +5138,7 @@ fn lower_unit(
51265138
                             is_pointer: true,
51275139
                             runtime_dim_upper: vec![],
51285140
                             is_class: false,
5129
-            logical_kind: None,
5141
+                            logical_kind: None,
51305142
                             last_dim_assumed_size: false,
51315143
                         },
51325144
                     );
@@ -5170,7 +5182,7 @@ fn lower_unit(
51705182
                             is_pointer: false,
51715183
                             runtime_dim_upper: vec![],
51725184
                             is_class: false,
5173
-            logical_kind: None,
5185
+                            logical_kind: None,
51745186
                             last_dim_assumed_size: false,
51755187
                         },
51765188
                     );
@@ -5184,7 +5196,13 @@ fn lower_unit(
51845196
                 }
51855197
 
51865198
                 install_common_locals(&mut b, &mut ctx.locals, decls);
5187
-                install_equivalence_locals(&mut b, &mut ctx.locals, decls, &visible_param_consts, st);
5199
+                install_equivalence_locals(
5200
+                    &mut b,
5201
+                    &mut ctx.locals,
5202
+                    decls,
5203
+                    &visible_param_consts,
5204
+                    st,
5205
+                );
51885206
                 install_host_ref_locals(&mut b, &mut ctx.locals, &host_ref_infos);
51895207
                 alloc_decls(
51905208
                     &mut b,
@@ -5257,7 +5275,9 @@ fn lower_unit(
52575275
                         derived_type_name_for_result_var(return_type, &result_name, decls);
52585276
                     let skip = if matches!(
52595277
                         hidden_result_abi,
5260
-                        HiddenResultAbi::ArrayDescriptor | HiddenResultAbi::DerivedAggregate | HiddenResultAbi::ComplexBuffer
5278
+                        HiddenResultAbi::ArrayDescriptor
5279
+                            | HiddenResultAbi::DerivedAggregate
5280
+                            | HiddenResultAbi::ComplexBuffer
52615281
                     ) {
52625282
                         Some(ValueId(0))
52635283
                     } else if !result_is_pointer && derived_result_type.is_some() {
@@ -5456,16 +5476,18 @@ fn lower_unit(
54565476
                 } else {
54575477
                     None
54585478
                 };
5459
-                let submod_scope = st.all_scopes().iter().enumerate().find_map(|(idx, scope)| {
5460
-                    match &scope.kind {
5461
-                        crate::sema::symtab::ScopeKind::Submodule(scope_name)
5462
-                            if scope_name.eq_ignore_ascii_case(submodule_name) =>
5463
-                        {
5464
-                            Some(idx)
5465
-                        }
5466
-                        _ => None,
5467
-                    }
5468
-                });
5479
+                let submod_scope =
5480
+                    st.all_scopes()
5481
+                        .iter()
5482
+                        .enumerate()
5483
+                        .find_map(|(idx, scope)| match &scope.kind {
5484
+                            crate::sema::symtab::ScopeKind::Submodule(scope_name)
5485
+                                if scope_name.eq_ignore_ascii_case(submodule_name) =>
5486
+                            {
5487
+                                Some(idx)
5488
+                            }
5489
+                            _ => None,
5490
+                        });
54695491
                 lower_unit(
54705492
                     module,
54715493
                     sub,
@@ -5718,7 +5740,12 @@ fn collect_decl_param_char_consts(
57185740
                 .any(|a| matches!(a, crate::ast::decl::Attribute::Parameter)) =>
57195741
             {
57205742
                 for entity in entities {
5721
-                    install_param_char_component_defaults(type_spec, entity, type_layouts, &mut out);
5743
+                    install_param_char_component_defaults(
5744
+                        type_spec,
5745
+                        entity,
5746
+                        type_layouts,
5747
+                        &mut out,
5748
+                    );
57225749
                     if let Some(init) = entity.init.as_ref() {
57235750
                         if let Some(bytes) = eval_const_char_bytes(init, param_consts, &out) {
57245751
                             out.insert(entity.name.to_lowercase(), bytes);
@@ -5792,42 +5819,42 @@ fn declared_char_len(
57925819
             Some(crate::ast::decl::LenSpec::Expr(e)) => {
57935820
                 eval_const_int_in_scope_or_any_scope(e, param_consts, st)
57945821
             }
5795
-            Some(crate::ast::decl::LenSpec::Star) => init_expr
5796
-                .and_then(|expr| {
5797
-                    eval_const_char_bytes(expr, param_consts, param_char_consts)
5798
-                        .map(|bytes| bytes.len() as i64)
5799
-                        .or_else(|| {
5800
-                            collect_const_char_array_elems(expr, param_consts, param_char_consts)
5801
-                                .map(|elems| {
5802
-                                    elems
5803
-                                        .iter()
5804
-                                        .map(|elem| elem.len() as i64)
5805
-                                        .max()
5806
-                                        .unwrap_or(0)
5807
-                                })
5808
-                        })
5809
-                        .or_else(|| {
5810
-                            // Fallback: when the init is a Name that
5811
-                            // refers to another character parameter
5812
-                            // visible via host/use association (e.g.
5813
-                            // `character(*), parameter :: vtype = type_rsp`
5814
-                            // where type_rsp lives in the parent module),
5815
-                            // extract the length from the symbol table.
5816
-                            if let crate::ast::expr::Expr::Name { name } = &expr.node {
5817
-                                let key = name.to_lowercase();
5818
-                                if let Some(sym) = st.find_symbol_any_scope(&key) {
5819
-                                    if let Some(crate::sema::symtab::TypeInfo::Character {
5820
-                                        len: Some(n),
5821
-                                        ..
5822
-                                    }) = &sym.type_info
5823
-                                    {
5824
-                                        return Some(*n);
5825
-                                    }
5822
+            Some(crate::ast::decl::LenSpec::Star) => init_expr.and_then(|expr| {
5823
+                eval_const_char_bytes(expr, param_consts, param_char_consts)
5824
+                    .map(|bytes| bytes.len() as i64)
5825
+                    .or_else(|| {
5826
+                        collect_const_char_array_elems(expr, param_consts, param_char_consts).map(
5827
+                            |elems| {
5828
+                                elems
5829
+                                    .iter()
5830
+                                    .map(|elem| elem.len() as i64)
5831
+                                    .max()
5832
+                                    .unwrap_or(0)
5833
+                            },
5834
+                        )
5835
+                    })
5836
+                    .or_else(|| {
5837
+                        // Fallback: when the init is a Name that
5838
+                        // refers to another character parameter
5839
+                        // visible via host/use association (e.g.
5840
+                        // `character(*), parameter :: vtype = type_rsp`
5841
+                        // where type_rsp lives in the parent module),
5842
+                        // extract the length from the symbol table.
5843
+                        if let crate::ast::expr::Expr::Name { name } = &expr.node {
5844
+                            let key = name.to_lowercase();
5845
+                            if let Some(sym) = st.find_symbol_any_scope(&key) {
5846
+                                if let Some(crate::sema::symtab::TypeInfo::Character {
5847
+                                    len: Some(n),
5848
+                                    ..
5849
+                                }) = &sym.type_info
5850
+                                {
5851
+                                    return Some(*n);
58265852
                                 }
58275853
                             }
5828
-                            None
5829
-                        })
5830
-                }),
5854
+                        }
5855
+                        None
5856
+                    })
5857
+            }),
58315858
             Some(crate::ast::decl::LenSpec::Colon) => None,
58325859
             None => Some(1),
58335860
         },
@@ -5894,7 +5921,11 @@ fn collect_const_char_array_elems(
58945921
             if let Expr::Name { name } = &callee.node {
58955922
                 if name.eq_ignore_ascii_case("reshape") && !args.is_empty() {
58965923
                     if let crate::ast::expr::SectionSubscript::Element(src) = &args[0].value {
5897
-                        return collect_const_char_array_elems(src, param_consts, param_char_consts);
5924
+                        return collect_const_char_array_elems(
5925
+                            src,
5926
+                            param_consts,
5927
+                            param_char_consts,
5928
+                        );
58985929
                     }
58995930
                 }
59005931
             }
@@ -5914,7 +5945,11 @@ fn collect_ac_char_value(
59145945
 
59155946
     match value {
59165947
         AcValue::Expr(expr) => {
5917
-            out.push(eval_const_char_bytes(expr, param_consts, param_char_consts)?);
5948
+            out.push(eval_const_char_bytes(
5949
+                expr,
5950
+                param_consts,
5951
+                param_char_consts,
5952
+            )?);
59185953
             Some(())
59195954
         }
59205955
         AcValue::ImpliedDo(ido) => {
@@ -6540,18 +6575,9 @@ fn eval_const_scalar(
65406575
                     // without folding here the const ends up at runtime-zero
65416576
                     // because there is no module-level evaluator emitting
65426577
                     // the value into storage for non-trivial initializers.
6543
-                    "sqrt" | "dsqrt"
6544
-                    | "exp" | "dexp"
6545
-                    | "log" | "dlog"
6546
-                    | "log10" | "dlog10"
6547
-                    | "sin" | "dsin"
6548
-                    | "cos" | "dcos"
6549
-                    | "tan" | "dtan"
6550
-                    | "asin" | "dasin"
6551
-                    | "acos" | "dacos"
6552
-                    | "atan" | "datan"
6553
-                    | "sinh" | "dsinh"
6554
-                    | "cosh" | "dcosh"
6578
+                    "sqrt" | "dsqrt" | "exp" | "dexp" | "log" | "dlog" | "log10" | "dlog10"
6579
+                    | "sin" | "dsin" | "cos" | "dcos" | "tan" | "dtan" | "asin" | "dasin"
6580
+                    | "acos" | "dacos" | "atan" | "datan" | "sinh" | "dsinh" | "cosh" | "dcosh"
65556581
                     | "tanh" | "dtanh" => {
65566582
                         let v = first_arg?.to_float();
65576583
                         let r = match key.as_str() {
@@ -6609,7 +6635,12 @@ fn eval_const_scalar(
66096635
                         // suffix (1.0d0 → 8). Integer literal → 4. Named
66106636
                         // constant — look up in param_consts to recover
66116637
                         // its kind by value range.
6612
-                        enum Kind { F32, F64, I32, I64 }
6638
+                        enum Kind {
6639
+                            F32,
6640
+                            F64,
6641
+                            I32,
6642
+                            I64,
6643
+                        }
66136644
                         let kind = match &e.node {
66146645
                             Expr::RealLiteral { text, kind, .. } => {
66156646
                                 let lower = text.to_ascii_lowercase();
@@ -6639,7 +6670,9 @@ fn eval_const_scalar(
66396670
                         match (key.as_str(), kind) {
66406671
                             ("epsilon", Kind::F32) => Some(ConstScalar::Float(f32::EPSILON as f64)),
66416672
                             ("epsilon", Kind::F64) => Some(ConstScalar::Float(f64::EPSILON)),
6642
-                            ("tiny", Kind::F32) => Some(ConstScalar::Float(f32::MIN_POSITIVE as f64)),
6673
+                            ("tiny", Kind::F32) => {
6674
+                                Some(ConstScalar::Float(f32::MIN_POSITIVE as f64))
6675
+                            }
66436676
                             ("tiny", Kind::F64) => Some(ConstScalar::Float(f64::MIN_POSITIVE)),
66446677
                             ("huge", Kind::F32) => Some(ConstScalar::Float(f32::MAX as f64)),
66456678
                             ("huge", Kind::F64) => Some(ConstScalar::Float(f64::MAX)),
@@ -6759,12 +6792,8 @@ fn collect_decl_param_consts_with_scope(
67596792
                         continue;
67606793
                     }
67616794
                     if let Some(init) = &entity.init {
6762
-                        if let Some(val) = eval_const_scalar_with_decl_scope(
6763
-                            init,
6764
-                            decls,
6765
-                            &param_consts,
6766
-                            st,
6767
-                        )
6795
+                        if let Some(val) =
6796
+                            eval_const_scalar_with_decl_scope(init, decls, &param_consts, st)
67686797
                         {
67696798
                             param_consts.insert(entity.name.to_lowercase(), val);
67706799
                         }
@@ -6773,12 +6802,8 @@ fn collect_decl_param_consts_with_scope(
67736802
             }
67746803
             Decl::ParameterStmt { pairs } => {
67756804
                 for (name, expr) in pairs {
6776
-                    if let Some(val) = eval_const_scalar_with_decl_scope(
6777
-                        expr,
6778
-                        decls,
6779
-                        &param_consts,
6780
-                        st,
6781
-                    )
6805
+                    if let Some(val) =
6806
+                        eval_const_scalar_with_decl_scope(expr, decls, &param_consts, st)
67826807
                     {
67836808
                         param_consts.insert(name.to_lowercase(), val);
67846809
                     }
@@ -6802,7 +6827,10 @@ fn declared_type_spec_for_name<'a>(
68026827
             ..
68036828
         } = &decl.node
68046829
         {
6805
-            if entities.iter().any(|entity| entity.name.to_lowercase() == key) {
6830
+            if entities
6831
+                .iter()
6832
+                .any(|entity| entity.name.to_lowercase() == key)
6833
+            {
68066834
                 return Some(type_spec);
68076835
             }
68086836
         }
@@ -6874,7 +6902,7 @@ fn install_host_param_consts(
68746902
                 is_pointer: false,
68756903
                 runtime_dim_upper: vec![],
68766904
                 is_class: false,
6877
-            logical_kind: None,
6905
+                logical_kind: None,
68786906
                 last_dim_assumed_size: false,
68796907
             },
68806908
         );
@@ -7748,7 +7776,7 @@ fn install_globals_as_locals_in(
77487776
                                         is_pointer: false,
77497777
                                         runtime_dim_upper: vec![],
77507778
                                         is_class: false,
7751
-            logical_kind: None,
7779
+                                        logical_kind: None,
77527780
                                         last_dim_assumed_size: false,
77537781
                                     },
77547782
                                 );
@@ -7772,7 +7800,7 @@ fn install_globals_as_locals_in(
77727800
                                         is_pointer: false,
77737801
                                         runtime_dim_upper: vec![],
77747802
                                         is_class: false,
7775
-            logical_kind: None,
7803
+                                        logical_kind: None,
77767804
                                         last_dim_assumed_size: false,
77777805
                                     },
77787806
                                 );
@@ -7952,7 +7980,7 @@ fn alloc_decls(
79527980
                                 .map(|specs| vec![None; specs.len()])
79537981
                                 .unwrap_or_default(),
79547982
                             is_class: false,
7955
-            logical_kind: None,
7983
+                            logical_kind: None,
79567984
                             last_dim_assumed_size: false,
79577985
                         },
79587986
                     );
@@ -7989,14 +8017,16 @@ fn alloc_decls(
79898017
                                 is_pointer: true,
79908018
                                 runtime_dim_upper: vec![],
79918019
                                 is_class: false,
7992
-            logical_kind: None,
8020
+                                logical_kind: None,
79938021
                                 last_dim_assumed_size: false,
79948022
                             },
79958023
                         );
79968024
                         continue;
79978025
                     }
79988026
                 }
7999
-                if is_pointer_attr && matches!(type_spec, TypeSpec::Class(_)) && array_spec.is_none()
8027
+                if is_pointer_attr
8028
+                    && matches!(type_spec, TypeSpec::Class(_))
8029
+                    && array_spec.is_none()
80008030
                 {
80018031
                     if let TypeSpec::Class(ref type_name) = type_spec {
80028032
                         let desc_ty = IrType::Array(Box::new(IrType::Int(IntWidth::I8)), 384);
@@ -8058,7 +8088,7 @@ fn alloc_decls(
80588088
                             is_pointer: is_pointer_attr,
80598089
                             runtime_dim_upper: vec![],
80608090
                             is_class: false,
8061
-            logical_kind: None,
8091
+                            logical_kind: None,
80628092
                             last_dim_assumed_size: false,
80638093
                         },
80648094
                     );
@@ -8069,12 +8099,8 @@ fn alloc_decls(
80698099
                     if (!matches!(type_spec, TypeSpec::Character(_)) || char_len.is_some())
80708100
                         && array_spec_has_runtime_bounds(specs, &param_consts, Some(st))
80718101
                     {
8072
-                        let dims = extract_array_dims_with_init(
8073
-                            specs,
8074
-                            init_expr,
8075
-                            &param_consts,
8076
-                            Some(st),
8077
-                        );
8102
+                        let dims =
8103
+                            extract_array_dims_with_init(specs, init_expr, &param_consts, Some(st));
80788104
                         let (array_elem_ty, array_derived_type, array_char_kind) = if matches!(
80798105
                             type_spec,
80808106
                             TypeSpec::Character(_)
@@ -8230,7 +8256,7 @@ fn alloc_decls(
82308256
                                 is_pointer: false,
82318257
                                 runtime_dim_upper: vec![],
82328258
                                 is_class: false,
8233
-            logical_kind: None,
8259
+                                logical_kind: None,
82348260
                                 last_dim_assumed_size: false,
82358261
                             },
82368262
                         );
@@ -8247,12 +8273,8 @@ fn alloc_decls(
82478273
                         // which is exactly how local `character(len=N),
82488274
                         // parameter :: builtins(...)` ended up crashing fortsh
82498275
                         // `type`/`command` with `0x202020...` memmove faults.
8250
-                        let dims = extract_array_dims_with_init(
8251
-                            specs,
8252
-                            init_expr,
8253
-                            &param_consts,
8254
-                            Some(st),
8255
-                        );
8276
+                        let dims =
8277
+                            extract_array_dims_with_init(specs, init_expr, &param_consts, Some(st));
82568278
                         let total_size: i64 = dims.iter().map(|(_, size)| *size).product();
82578279
                         let elem_ty = fixed_char_storage_ir_type(len);
82588280
                         let elem_bytes = ir_scalar_byte_size(&elem_ty);
@@ -8300,7 +8322,7 @@ fn alloc_decls(
83008322
                                     is_pointer: false,
83018323
                                     runtime_dim_upper: vec![],
83028324
                                     is_class: false,
8303
-            logical_kind: None,
8325
+                                    logical_kind: None,
83048326
                                     last_dim_assumed_size: false,
83058327
                                 },
83068328
                             );
@@ -8328,7 +8350,7 @@ fn alloc_decls(
83288350
                                     is_pointer: false,
83298351
                                     runtime_dim_upper: vec![],
83308352
                                     is_class: false,
8331
-            logical_kind: None,
8353
+                                    logical_kind: None,
83328354
                                     last_dim_assumed_size: false,
83338355
                                 },
83348356
                             );
@@ -8364,7 +8386,7 @@ fn alloc_decls(
83648386
                                 is_pointer: true,
83658387
                                 runtime_dim_upper: vec![],
83668388
                                 is_class: false,
8367
-            logical_kind: None,
8389
+                                logical_kind: None,
83688390
                                 last_dim_assumed_size: false,
83698391
                             },
83708392
                         );
@@ -8407,7 +8429,7 @@ fn alloc_decls(
84078429
                                 is_pointer: false,
84088430
                                 runtime_dim_upper: vec![],
84098431
                                 is_class: false,
8410
-            logical_kind: None,
8432
+                                logical_kind: None,
84118433
                                 last_dim_assumed_size: false,
84128434
                             },
84138435
                         );
@@ -8468,7 +8490,7 @@ fn alloc_decls(
84688490
                                 is_pointer: false,
84698491
                                 runtime_dim_upper: vec![],
84708492
                                 is_class: false,
8471
-            logical_kind: None,
8493
+                                logical_kind: None,
84728494
                                 last_dim_assumed_size: false,
84738495
                             },
84748496
                         );
@@ -8527,21 +8549,22 @@ fn alloc_decls(
85278549
                                 .unwrap_or_default(),
85288550
                             is_class: matches!(type_spec, TypeSpec::Class(_)),
85298551
                             logical_kind: if let TypeSpec::Logical(sel) = type_spec {
8530
-                                Some(extract_kind_with_context(sel, 4, Some(&param_consts), Some(st)))
8552
+                                Some(extract_kind_with_context(
8553
+                                    sel,
8554
+                                    4,
8555
+                                    Some(&param_consts),
8556
+                                    Some(st),
8557
+                                ))
85318558
                             } else {
85328559
                                 None
85338560
                             },
8534
-                                                    last_dim_assumed_size: false,
8561
+                            last_dim_assumed_size: false,
85358562
                         },
85368563
                     );
85378564
                 } else if let Some(specs) = array_spec {
85388565
                     // Fixed-size array variable.
8539
-                    let dims = extract_array_dims_with_init(
8540
-                        specs,
8541
-                        init_expr,
8542
-                        &param_consts,
8543
-                        Some(st),
8544
-                    );
8566
+                    let dims =
8567
+                        extract_array_dims_with_init(specs, init_expr, &param_consts, Some(st));
85458568
                     let total_size: i64 = dims.iter().map(|(_, size)| *size).product();
85468569
                     let (array_elem_ty, array_derived_type, array_char_kind) =
85478570
                         if matches!(type_spec, TypeSpec::Character(_)) {
@@ -8624,11 +8647,16 @@ fn alloc_decls(
86248647
                                 runtime_dim_upper: vec![],
86258648
                                 is_class: false,
86268649
                                 logical_kind: if let TypeSpec::Logical(sel) = type_spec {
8627
-                                    Some(extract_kind_with_context(sel, 4, Some(&param_consts), Some(st)))
8650
+                                    Some(extract_kind_with_context(
8651
+                                        sel,
8652
+                                        4,
8653
+                                        Some(&param_consts),
8654
+                                        Some(st),
8655
+                                    ))
86288656
                                 } else {
86298657
                                     None
86308658
                                 },
8631
-                                                            last_dim_assumed_size: false,
8659
+                                last_dim_assumed_size: false,
86328660
                             },
86338661
                         );
86348662
                     } else {
@@ -8665,8 +8693,12 @@ fn alloc_decls(
86658693
                                 is_pointer: false,
86668694
                                 runtime_dim_upper: vec![],
86678695
                                 is_class: false,
8668
-                                logical_kind: type_spec_logical_kind(type_spec, Some(&param_consts), Some(st)),
8669
-                                                            last_dim_assumed_size: false,
8696
+                                logical_kind: type_spec_logical_kind(
8697
+                                    type_spec,
8698
+                                    Some(&param_consts),
8699
+                                    Some(st),
8700
+                                ),
8701
+                                last_dim_assumed_size: false,
86708702
                             },
86718703
                         );
86728704
                     }
@@ -8696,7 +8728,7 @@ fn alloc_decls(
86968728
                                 is_pointer: false,
86978729
                                 runtime_dim_upper: vec![],
86988730
                                 is_class: false,
8699
-            logical_kind: None,
8731
+                                logical_kind: None,
87008732
                                 last_dim_assumed_size: false,
87018733
                             },
87028734
                         );
@@ -8718,7 +8750,7 @@ fn alloc_decls(
87188750
                                 is_pointer: false,
87198751
                                 runtime_dim_upper: vec![],
87208752
                                 is_class: false,
8721
-            logical_kind: None,
8753
+                                logical_kind: None,
87228754
                                 last_dim_assumed_size: false,
87238755
                             },
87248756
                         );
@@ -8757,7 +8789,7 @@ fn alloc_decls(
87578789
                             is_pointer: true,
87588790
                             runtime_dim_upper: vec![],
87598791
                             is_class: false,
8760
-            logical_kind: None,
8792
+                            logical_kind: None,
87618793
                             last_dim_assumed_size: false,
87628794
                         },
87638795
                     );
@@ -8799,7 +8831,7 @@ fn alloc_decls(
87998831
                                     is_pointer: false,
88008832
                                     runtime_dim_upper: vec![],
88018833
                                     is_class: false,
8802
-            logical_kind: None,
8834
+                                    logical_kind: None,
88038835
                                     last_dim_assumed_size: false,
88048836
                                 },
88058837
                             );
@@ -8837,8 +8869,12 @@ fn alloc_decls(
88378869
                                 is_pointer: false,
88388870
                                 runtime_dim_upper: vec![],
88398871
                                 is_class: false,
8840
-                                logical_kind: type_spec_logical_kind(type_spec, Some(&param_consts), Some(st)),
8841
-                                                            last_dim_assumed_size: false,
8872
+                                logical_kind: type_spec_logical_kind(
8873
+                                    type_spec,
8874
+                                    Some(&param_consts),
8875
+                                    Some(st),
8876
+                                ),
8877
+                                last_dim_assumed_size: false,
88428878
                             },
88438879
                         );
88448880
                     } else {
@@ -8858,8 +8894,12 @@ fn alloc_decls(
88588894
                                 is_pointer: false,
88598895
                                 runtime_dim_upper: vec![],
88608896
                                 is_class: false,
8861
-                                logical_kind: type_spec_logical_kind(type_spec, Some(&param_consts), Some(st)),
8862
-                                                            last_dim_assumed_size: false,
8897
+                                logical_kind: type_spec_logical_kind(
8898
+                                    type_spec,
8899
+                                    Some(&param_consts),
8900
+                                    Some(st),
8901
+                                ),
8902
+                                last_dim_assumed_size: false,
88638903
                             },
88648904
                         );
88658905
                     }
@@ -8978,9 +9018,7 @@ fn init_decls(
89789018
                                     b.store(val, slot);
89799019
                                 }
89809020
                             }
8981
-                        } else if let Some(values) =
8982
-                            extract_reshape_source_ac(&init_expr.node)
8983
-                        {
9021
+                        } else if let Some(values) = extract_reshape_source_ac(&init_expr.node) {
89849022
                             // F2018 §16.9.169 RESHAPE used as a declared
89859023
                             // initializer for a fixed-shape stack array.
89869024
                             // The source AC is laid out column-major into
@@ -9314,8 +9352,7 @@ fn coerce_to_type(b: &mut FuncBuilder, val: ValueId, target: &IrType) -> ValueId
93149352
             };
93159353
             let buf = b.alloca(IrType::Array(Box::new(IrType::Float(fw)), 2));
93169354
             let zero_off = b.const_i64(0);
9317
-            let lane_bytes =
9318
-                b.const_i64(if fw == FloatWidth::F64 { 8 } else { 4 });
9355
+            let lane_bytes = b.const_i64(if fw == FloatWidth::F64 { 8 } else { 4 });
93199356
             let re_ptr = b.gep(buf, vec![zero_off], IrType::Int(IntWidth::I8));
93209357
             let im_ptr = b.gep(buf, vec![lane_bytes], IrType::Int(IntWidth::I8));
93219358
             b.store(re, re_ptr);
@@ -9325,7 +9362,9 @@ fn coerce_to_type(b: &mut FuncBuilder, val: ValueId, target: &IrType) -> ValueId
93259362
         // Real → Complex (F2018 §10.1.10.1): real becomes real part,
93269363
         // imaginary part 0. Width-adjusts when source and target
93279364
         // float widths differ (e.g. real(sp) literal → complex(dp)).
9328
-        (IrType::Float(src_fw), IrType::Array(elem, 2)) if matches!(elem.as_ref(), IrType::Float(_)) => {
9365
+        (IrType::Float(src_fw), IrType::Array(elem, 2))
9366
+            if matches!(elem.as_ref(), IrType::Float(_)) =>
9367
+        {
93299368
             let target_fw = match elem.as_ref() {
93309369
                 IrType::Float(fw) => *fw,
93319370
                 _ => unreachable!(),
@@ -9343,8 +9382,7 @@ fn coerce_to_type(b: &mut FuncBuilder, val: ValueId, target: &IrType) -> ValueId
93439382
             };
93449383
             let buf = b.alloca(IrType::Array(Box::new(IrType::Float(target_fw)), 2));
93459384
             let zero_off = b.const_i64(0);
9346
-            let lane_bytes =
9347
-                b.const_i64(if target_fw == FloatWidth::F64 { 8 } else { 4 });
9385
+            let lane_bytes = b.const_i64(if target_fw == FloatWidth::F64 { 8 } else { 4 });
93489386
             let re_ptr = b.gep(buf, vec![zero_off], IrType::Int(IntWidth::I8));
93499387
             let im_ptr = b.gep(buf, vec![lane_bytes], IrType::Int(IntWidth::I8));
93509388
             b.store(re, re_ptr);
@@ -9517,7 +9555,11 @@ fn extract_array_dims_with_init(
95179555
         return dims;
95189556
     };
95199557
 
9520
-    let prefix_extent: i64 = dims.iter().take(last_assumed_idx).map(|(_, extent)| *extent).product();
9558
+    let prefix_extent: i64 = dims
9559
+        .iter()
9560
+        .take(last_assumed_idx)
9561
+        .map(|(_, extent)| *extent)
9562
+        .product();
95219563
     if prefix_extent <= 0 || init_len < 0 || init_len % prefix_extent != 0 {
95229564
         return dims;
95239565
     }
@@ -9753,7 +9795,9 @@ fn decl_scope_const_ir_type(
97539795
         Expr::IntegerLiteral { kind, .. } => {
97549796
             let kind_width = kind
97559797
                 .as_deref()
9756
-                .map(|kind_str| int_kind_to_width_in_context(kind_str, None, Some(param_consts), Some(st)))
9798
+                .map(|kind_str| {
9799
+                    int_kind_to_width_in_context(kind_str, None, Some(param_consts), Some(st))
9800
+                })
97579801
                 .unwrap_or_else(crate::driver::defaults::default_int_kind);
97589802
             Some(IrType::int_from_kind(kind_width))
97599803
         }
@@ -10678,24 +10722,21 @@ fn fixed_char_expr_len(
1067810722
 ) -> Option<i64> {
1067910723
     match &expr.node {
1068010724
         Expr::StringLiteral { value, .. } => Some(value.len() as i64),
10681
-        Expr::Name { name } => {
10682
-            locals
10683
-                .get(&name.to_lowercase())
10684
-                .and_then(|info| match info.char_kind {
10685
-                    CharKind::Fixed(len) => Some(len),
10686
-                    _ => local_fixed_char_allocatable_scalar_len(info),
10687
-                })
10688
-                .or_else(|| {
10689
-                    st.find_symbol_any_scope(&name.to_lowercase())
10690
-                        .and_then(|sym| match sym.type_info.as_ref() {
10691
-                            Some(crate::sema::symtab::TypeInfo::Character {
10692
-                                len: Some(len),
10693
-                                ..
10694
-                            }) => Some(*len),
10695
-                            _ => None,
10696
-                        })
10697
-                })
10698
-        }
10725
+        Expr::Name { name } => locals
10726
+            .get(&name.to_lowercase())
10727
+            .and_then(|info| match info.char_kind {
10728
+                CharKind::Fixed(len) => Some(len),
10729
+                _ => local_fixed_char_allocatable_scalar_len(info),
10730
+            })
10731
+            .or_else(|| {
10732
+                st.find_symbol_any_scope(&name.to_lowercase())
10733
+                    .and_then(|sym| match sym.type_info.as_ref() {
10734
+                        Some(crate::sema::symtab::TypeInfo::Character {
10735
+                            len: Some(len), ..
10736
+                        }) => Some(*len),
10737
+                        _ => None,
10738
+                    })
10739
+            }),
1069910740
         Expr::ComponentAccess { .. } => {
1070010741
             let tl = type_layouts?;
1070110742
             let (_field_ptr, field) = resolve_component_field_access(b, locals, expr, st, tl)?;
@@ -10839,23 +10880,21 @@ fn first_array_constructor_type_info(
1083910880
     let first = first_array_constructor_expr(values)?;
1084010881
     operator_expr_type_info(first, locals, st, type_layouts)
1084110882
         .or_else(|| match &first.node {
10842
-            Expr::FunctionCall { callee, .. } => match &callee.node {
10843
-                Expr::Name { name } => st.all_scopes().iter().find_map(|scope| {
10844
-                    let sym = scope.symbols.get(&name.to_ascii_lowercase())?;
10845
-                    if matches!(sym.kind, crate::sema::symtab::SymbolKind::DerivedType) {
10846
-                        Some(
10847
-                            sym.type_info
10848
-                                .clone()
10849
-                                .unwrap_or(crate::sema::symtab::TypeInfo::Derived(
10850
-                                    sym.name.clone(),
10851
-                                )),
10852
-                        )
10853
-                    } else {
10854
-                        None
10855
-                    }
10856
-                }),
10857
-                _ => None,
10858
-            },
10883
+            Expr::FunctionCall { callee, .. } => {
10884
+                match &callee.node {
10885
+                    Expr::Name { name } => st.all_scopes().iter().find_map(|scope| {
10886
+                        let sym = scope.symbols.get(&name.to_ascii_lowercase())?;
10887
+                        if matches!(sym.kind, crate::sema::symtab::SymbolKind::DerivedType) {
10888
+                            Some(sym.type_info.clone().unwrap_or(
10889
+                                crate::sema::symtab::TypeInfo::Derived(sym.name.clone()),
10890
+                            ))
10891
+                        } else {
10892
+                            None
10893
+                        }
10894
+                    }),
10895
+                    _ => None,
10896
+                }
10897
+            }
1085910898
             _ => None,
1086010899
         })
1086110900
         .or_else(|| fortran_type_to_type_info(&crate::sema::types::expr_type(first, st)))
@@ -11373,8 +11412,7 @@ fn lower_logical_reduction_intrinsic_ast(
1137311412
         internal_funcs,
1137411413
         contained_host_refs,
1137511414
         descriptor_params,
11376
-    )
11377
-    {
11415
+    ) {
1137811416
         let runtime = match name {
1137911417
             "any" => "afs_array_any_logical",
1138011418
             "all" => "afs_array_all_logical",
@@ -11436,8 +11474,7 @@ fn lower_logical_reduction_intrinsic_ast(
1143611474
                 match &e.node {
1143711475
                     Expr::ArrayConstructor { .. } => true,
1143811476
                     Expr::BinaryOp { left, right, .. } => {
11439
-                        contains_array_constructor(left)
11440
-                            || contains_array_constructor(right)
11477
+                        contains_array_constructor(left) || contains_array_constructor(right)
1144111478
                     }
1144211479
                     Expr::UnaryOp { operand, .. } => contains_array_constructor(operand),
1144311480
                     Expr::ParenExpr { inner } => contains_array_constructor(inner),
@@ -11449,9 +11486,7 @@ fn lower_logical_reduction_intrinsic_ast(
1144911486
             let acceptable_for_compare = |t: &FortranType| {
1145011487
                 matches!(
1145111488
                     t,
11452
-                    FortranType::Integer { .. }
11453
-                        | FortranType::Real { .. }
11454
-                        | FortranType::Unknown
11489
+                    FortranType::Integer { .. } | FortranType::Real { .. } | FortranType::Unknown
1145511490
                 )
1145611491
             };
1145711492
             if !acceptable_for_compare(&lt)
@@ -11461,116 +11496,115 @@ fn lower_logical_reduction_intrinsic_ast(
1146111496
             {
1146211497
                 // Fall through to the existing match arms.
1146311498
             } else {
11464
-            let lhs = lower_array_expr_descriptor(
11465
-                b,
11466
-                locals,
11467
-                left,
11468
-                st,
11469
-                type_layouts,
11470
-                internal_funcs,
11471
-                contained_host_refs,
11472
-                descriptor_params,
11473
-            );
11474
-            let rhs = lower_array_expr_descriptor(
11475
-                b,
11476
-                locals,
11477
-                right,
11478
-                st,
11479
-                type_layouts,
11480
-                internal_funcs,
11481
-                contained_host_refs,
11482
-                descriptor_params,
11483
-            );
11484
-            if lhs.is_some() || rhs.is_some() {
11485
-                let (source_desc, elem_ty) = lhs
11486
-                    .as_ref()
11487
-                    .map(|(d, t)| (*d, t.clone()))
11488
-                    .or_else(|| rhs.as_ref().map(|(d, t)| (*d, t.clone())))?;
11489
-                // Only handle wider numeric element types here. Skip I8
11490
-                // because that's how character(1) arrays present, where
11491
-                // a comparison like `s([5,8]) /= '-'` has character-string
11492
-                // semantics and the existing vector-subscript expansion
11493
-                // path handles it correctly. Complex and non-scalar shapes
11494
-                // also need richer handling than this loop.
11495
-                let scalar_numeric = match elem_ty {
11496
-                    IrType::Int(IntWidth::I8) => false,
11497
-                    IrType::Int(_) | IrType::Float(_) | IrType::Bool => true,
11498
-                    _ => false,
11499
-                };
11500
-                if !scalar_numeric {
11501
-                    return None;
11502
-                }
11503
-
11504
-                let n = b.call(
11505
-                    FuncRef::External("afs_array_size".into()),
11506
-                    vec![source_desc],
11507
-                    IrType::Int(IntWidth::I64),
11499
+                let lhs = lower_array_expr_descriptor(
11500
+                    b,
11501
+                    locals,
11502
+                    left,
11503
+                    st,
11504
+                    type_layouts,
11505
+                    internal_funcs,
11506
+                    contained_host_refs,
11507
+                    descriptor_params,
1150811508
                 );
11509
-                let acc_ty = if name == "count" {
11510
-                    IrType::Int(IntWidth::I32)
11511
-                } else {
11512
-                    IrType::Bool
11513
-                };
11514
-                let acc_addr = b.alloca(acc_ty);
11515
-                let acc_init = init_logical_reduction_acc(b, name);
11516
-                b.store(acc_init, acc_addr);
11517
-                let i_addr = b.alloca(IrType::Int(IntWidth::I64));
11518
-                let zero64 = b.const_i64(0);
11519
-                b.store(zero64, i_addr);
11520
-
11521
-                let bb_check = b.create_block("any_cmp_check");
11522
-                let bb_body = b.create_block("any_cmp_body");
11523
-                let bb_exit = b.create_block("any_cmp_exit");
11524
-                b.branch(bb_check, vec![]);
11509
+                let rhs = lower_array_expr_descriptor(
11510
+                    b,
11511
+                    locals,
11512
+                    right,
11513
+                    st,
11514
+                    type_layouts,
11515
+                    internal_funcs,
11516
+                    contained_host_refs,
11517
+                    descriptor_params,
11518
+                );
11519
+                if lhs.is_some() || rhs.is_some() {
11520
+                    let (source_desc, elem_ty) = lhs
11521
+                        .as_ref()
11522
+                        .map(|(d, t)| (*d, t.clone()))
11523
+                        .or_else(|| rhs.as_ref().map(|(d, t)| (*d, t.clone())))?;
11524
+                    // Only handle wider numeric element types here. Skip I8
11525
+                    // because that's how character(1) arrays present, where
11526
+                    // a comparison like `s([5,8]) /= '-'` has character-string
11527
+                    // semantics and the existing vector-subscript expansion
11528
+                    // path handles it correctly. Complex and non-scalar shapes
11529
+                    // also need richer handling than this loop.
11530
+                    let scalar_numeric = match elem_ty {
11531
+                        IrType::Int(IntWidth::I8) => false,
11532
+                        IrType::Int(_) | IrType::Float(_) | IrType::Bool => true,
11533
+                        _ => false,
11534
+                    };
11535
+                    if !scalar_numeric {
11536
+                        return None;
11537
+                    }
1152511538
 
11526
-                b.set_block(bb_check);
11527
-                let i = b.load(i_addr);
11528
-                let done = b.icmp(CmpOp::Ge, i, n);
11529
-                b.cond_branch(done, bb_exit, vec![], bb_body, vec![]);
11530
-
11531
-                b.set_block(bb_body);
11532
-                let idx = b.load(i_addr);
11533
-
11534
-                let load_side = |b: &mut FuncBuilder,
11535
-                                 side: &Option<(ValueId, IrType)>,
11536
-                                 side_expr: &crate::ast::expr::SpannedExpr|
11537
-                 -> ValueId {
11538
-                    if let Some((desc, _)) = side {
11539
-                        let elem_ptr =
11540
-                            rank1_array_desc_elem_ptr(b, *desc, &elem_ty, idx);
11541
-                        b.load_typed(elem_ptr, elem_ty.clone())
11539
+                    let n = b.call(
11540
+                        FuncRef::External("afs_array_size".into()),
11541
+                        vec![source_desc],
11542
+                        IrType::Int(IntWidth::I64),
11543
+                    );
11544
+                    let acc_ty = if name == "count" {
11545
+                        IrType::Int(IntWidth::I32)
1154211546
                     } else {
11543
-                        let raw = lower_expr_full(
11544
-                            b,
11545
-                            locals,
11546
-                            side_expr,
11547
-                            st,
11548
-                            type_layouts,
11549
-                            internal_funcs,
11550
-                            contained_host_refs,
11551
-                            descriptor_params,
11552
-                        );
11553
-                        coerce_to_type(b, raw, &elem_ty)
11554
-                    }
11555
-                };
11556
-                let lv = load_side(b, &lhs, left);
11557
-                let rv = load_side(b, &rhs, right);
11558
-                let pred = match &elem_ty {
11559
-                    IrType::Float(_) => b.fcmp(cmp, lv, rv),
11560
-                    _ => b.icmp(cmp, lv, rv),
11561
-                };
11562
-                let acc = b.load(acc_addr);
11563
-                let new_acc = step_logical_reduction_acc(b, name, acc, pred);
11564
-                b.store(new_acc, acc_addr);
11547
+                        IrType::Bool
11548
+                    };
11549
+                    let acc_addr = b.alloca(acc_ty);
11550
+                    let acc_init = init_logical_reduction_acc(b, name);
11551
+                    b.store(acc_init, acc_addr);
11552
+                    let i_addr = b.alloca(IrType::Int(IntWidth::I64));
11553
+                    let zero64 = b.const_i64(0);
11554
+                    b.store(zero64, i_addr);
1156511555
 
11566
-                let one = b.const_i64(1);
11567
-                let next = b.iadd(idx, one);
11568
-                b.store(next, i_addr);
11569
-                b.branch(bb_check, vec![]);
11556
+                    let bb_check = b.create_block("any_cmp_check");
11557
+                    let bb_body = b.create_block("any_cmp_body");
11558
+                    let bb_exit = b.create_block("any_cmp_exit");
11559
+                    b.branch(bb_check, vec![]);
1157011560
 
11571
-                b.set_block(bb_exit);
11572
-                return Some(b.load(acc_addr));
11573
-            }
11561
+                    b.set_block(bb_check);
11562
+                    let i = b.load(i_addr);
11563
+                    let done = b.icmp(CmpOp::Ge, i, n);
11564
+                    b.cond_branch(done, bb_exit, vec![], bb_body, vec![]);
11565
+
11566
+                    b.set_block(bb_body);
11567
+                    let idx = b.load(i_addr);
11568
+
11569
+                    let load_side = |b: &mut FuncBuilder,
11570
+                                     side: &Option<(ValueId, IrType)>,
11571
+                                     side_expr: &crate::ast::expr::SpannedExpr|
11572
+                     -> ValueId {
11573
+                        if let Some((desc, _)) = side {
11574
+                            let elem_ptr = rank1_array_desc_elem_ptr(b, *desc, &elem_ty, idx);
11575
+                            b.load_typed(elem_ptr, elem_ty.clone())
11576
+                        } else {
11577
+                            let raw = lower_expr_full(
11578
+                                b,
11579
+                                locals,
11580
+                                side_expr,
11581
+                                st,
11582
+                                type_layouts,
11583
+                                internal_funcs,
11584
+                                contained_host_refs,
11585
+                                descriptor_params,
11586
+                            );
11587
+                            coerce_to_type(b, raw, &elem_ty)
11588
+                        }
11589
+                    };
11590
+                    let lv = load_side(b, &lhs, left);
11591
+                    let rv = load_side(b, &rhs, right);
11592
+                    let pred = match &elem_ty {
11593
+                        IrType::Float(_) => b.fcmp(cmp, lv, rv),
11594
+                        _ => b.icmp(cmp, lv, rv),
11595
+                    };
11596
+                    let acc = b.load(acc_addr);
11597
+                    let new_acc = step_logical_reduction_acc(b, name, acc, pred);
11598
+                    b.store(new_acc, acc_addr);
11599
+
11600
+                    let one = b.const_i64(1);
11601
+                    let next = b.iadd(idx, one);
11602
+                    b.store(next, i_addr);
11603
+                    b.branch(bb_check, vec![]);
11604
+
11605
+                    b.set_block(bb_exit);
11606
+                    return Some(b.load(acc_addr));
11607
+                }
1157411608
             }
1157511609
         }
1157611610
     }
@@ -11663,8 +11697,14 @@ fn lower_logical_reduction_intrinsic_ast(
1166311697
             }
1166411698
             let unfolded_left = unfold_array_ctor_binop(left);
1166511699
             let unfolded_right = unfold_array_ctor_binop(right);
11666
-            let left_node = unfolded_left.as_ref().map(|e| &e.node).unwrap_or(&left.node);
11667
-            let right_node = unfolded_right.as_ref().map(|e| &e.node).unwrap_or(&right.node);
11700
+            let left_node = unfolded_left
11701
+                .as_ref()
11702
+                .map(|e| &e.node)
11703
+                .unwrap_or(&left.node);
11704
+            let right_node = unfolded_right
11705
+                .as_ref()
11706
+                .map(|e| &e.node)
11707
+                .unwrap_or(&right.node);
1166811708
             match (left_node, right_node) {
1166911709
                 (Expr::ArrayConstructor { values, .. }, _) => {
1167011710
                     let mut acc = init_logical_reduction_acc(b, name);
@@ -11755,7 +11795,7 @@ fn lower_logical_reduction_intrinsic_ast(
1175511795
                     is_pointer: false,
1175611796
                     runtime_dim_upper: vec![],
1175711797
                     is_class: false,
11758
-            logical_kind: None,
11798
+                    logical_kind: None,
1175911799
                     last_dim_assumed_size: false,
1176011800
                 },
1176111801
             );
@@ -11862,7 +11902,7 @@ fn lower_logical_reduction_intrinsic_ast(
1186211902
                     is_pointer: false,
1186311903
                     runtime_dim_upper: vec![],
1186411904
                     is_class: false,
11865
-            logical_kind: None,
11905
+                    logical_kind: None,
1186611906
                     last_dim_assumed_size: false,
1186711907
                 },
1186811908
             );
@@ -12556,7 +12596,8 @@ fn lower_intrinsic(b: &mut FuncBuilder, name: &str, args: &[ValueId]) -> Option<
1255612596
                 let pos_top = b.isub(bits, shift);
1255712597
                 // Pre-fill: -1 if top bit of x is 1, else 0.
1255812598
                 let one = int_const_for_width(b, value_width, 1);
12559
-                let top_bit_pos = int_const_for_width(b, value_width, (value_width.bits() - 1) as i64);
12599
+                let top_bit_pos =
12600
+                    int_const_for_width(b, value_width, (value_width.bits() - 1) as i64);
1256012601
                 let top_bit = b.lshr(args[0], top_bit_pos);
1256112602
                 let sign = b.bit_and(top_bit, one);
1256212603
                 let neg_one = int_const_for_width(b, value_width, -1);
@@ -13638,7 +13679,14 @@ fn generic_candidate_matches_slots_with_formal_skip(
1363813679
         return false;
1363913680
     }
1364013681
 
13641
-    generic_candidate_matches_slots_with_proc(b, declared_args, arg_slots, supplied, formal_skip, &[])
13682
+    generic_candidate_matches_slots_with_proc(
13683
+        b,
13684
+        declared_args,
13685
+        arg_slots,
13686
+        supplied,
13687
+        formal_skip,
13688
+        &[],
13689
+    )
1364213690
 }
1364313691
 
1364413692
 fn generic_candidate_matches_slots_with_proc(
@@ -13650,7 +13698,13 @@ fn generic_candidate_matches_slots_with_proc(
1365013698
     actual_is_procedure: &[bool],
1365113699
 ) -> bool {
1365213700
     generic_candidate_matches_slots_with_proc_elemental(
13653
-        b, declared_args, arg_slots, _supplied, formal_skip, actual_is_procedure, false,
13701
+        b,
13702
+        declared_args,
13703
+        arg_slots,
13704
+        _supplied,
13705
+        formal_skip,
13706
+        actual_is_procedure,
13707
+        false,
1365413708
     )
1365513709
 }
1365613710
 
@@ -13669,8 +13723,7 @@ fn generic_candidate_matches_slots_with_proc_elemental(
1366913723
         }
1367013724
         match arg_slots.get(idx) {
1367113725
             Some(Some(arg_val)) => {
13672
-                let actual_is_proc =
13673
-                    actual_is_procedure.get(idx).copied().unwrap_or(false);
13726
+                let actual_is_proc = actual_is_procedure.get(idx).copied().unwrap_or(false);
1367413727
                 if actual_is_proc {
1367513728
                     continue;
1367613729
                 }
@@ -13744,8 +13797,7 @@ fn reorder_value_slots_by_formal_skip(
1374413797
             let key = kw.to_ascii_lowercase();
1374513798
             let idx = formal_order
1374613799
                 .iter()
13747
-                .position(|name| name.eq_ignore_ascii_case(&key))
13748
-                ?;
13800
+                .position(|name| name.eq_ignore_ascii_case(&key))?;
1374913801
             if idx < last_positional || slots[idx].is_some() {
1375013802
                 return None;
1375113803
             }
@@ -13782,8 +13834,7 @@ fn reorder_semantic_type_slots_by_formal_skip(
1378213834
             let key = kw.to_ascii_lowercase();
1378313835
             let idx = formal_order
1378413836
                 .iter()
13785
-                .position(|name| name.eq_ignore_ascii_case(&key))
13786
-                ?;
13837
+                .position(|name| name.eq_ignore_ascii_case(&key))?;
1378713838
             if idx < last_positional || slots[idx].is_some() {
1378813839
                 return None;
1378913840
             }
@@ -13871,7 +13922,10 @@ fn resolve_generic_call_by_semantics(
1387113922
             continue;
1387213923
         };
1387313924
         let declared_args = declared_args_for_scope(scope);
13874
-        let required = declared_args.iter().filter(|sym| !sym.attrs.optional).count();
13925
+        let required = declared_args
13926
+            .iter()
13927
+            .filter(|sym| !sym.attrs.optional)
13928
+            .count();
1387513929
         if args.len() < required || args.len() > declared_args.len() {
1387613930
             continue;
1387713931
         }
@@ -13884,13 +13938,16 @@ fn resolve_generic_call_by_semantics(
1388413938
             continue;
1388513939
         };
1388613940
         let semantic_match = declared_args.iter().enumerate().all(|(idx, declared_arg)| {
13887
-            declared_arg.type_info.as_ref().is_some_and(|declared_type| {
13888
-                generic_declared_semantic_match(
13889
-                    declared_type,
13890
-                    semantic_slots.get(idx).and_then(|slot| slot.as_ref()),
13891
-                    type_layouts,
13892
-                )
13893
-            })
13941
+            declared_arg
13942
+                .type_info
13943
+                .as_ref()
13944
+                .is_some_and(|declared_type| {
13945
+                    generic_declared_semantic_match(
13946
+                        declared_type,
13947
+                        semantic_slots.get(idx).and_then(|slot| slot.as_ref()),
13948
+                        type_layouts,
13949
+                    )
13950
+                })
1389413951
         });
1389513952
         if semantic_match {
1389613953
             return Some(candidate.clone());
@@ -13950,7 +14007,10 @@ fn resolve_generic_call_actuals(
1395014007
         // call binds to a 2-formal candidate via the slot reorder's
1395114008
         // overflow push, so e.g. `mean(y, 1, mask)` resolves to
1395214009
         // `mean_2_rsp_rsp(x, dim)` ignoring the mask.
13953
-        let required = declared_args.iter().filter(|sym| !sym.attrs.optional).count();
14010
+        let required = declared_args
14011
+            .iter()
14012
+            .filter(|sym| !sym.attrs.optional)
14013
+            .count();
1395414014
         if args.len() < required || args.len() > declared_args.len() {
1395514015
             continue;
1395614016
         }
@@ -13967,12 +14027,8 @@ fn resolve_generic_call_actuals(
1396714027
         ) else {
1396814028
             continue;
1396914029
         };
13970
-        let rank_slots: Vec<Option<usize>> = reorder_actual_ranks_by_formal_skip(
13971
-            args,
13972
-            &actual_ranks,
13973
-            &scope.arg_order,
13974
-            0,
13975
-        );
14030
+        let rank_slots: Vec<Option<usize>> =
14031
+            reorder_actual_ranks_by_formal_skip(args, &actual_ranks, &scope.arg_order, 0);
1397614032
         let supplied = arg_slots.iter().filter(|slot| slot.is_some()).count();
1397714033
         // Detect actuals that are procedure references. Such actuals
1397814034
         // bind to `procedure(iface) :: p` formals which the .amod
@@ -14020,10 +14076,7 @@ fn resolve_generic_call_actuals(
1402014076
             0,
1402114077
         );
1402214078
         let semantic_match = declared_args.iter().enumerate().all(|(idx, declared_arg)| {
14023
-            let actual_is_proc = actual_is_procedure_slots
14024
-                .get(idx)
14025
-                .copied()
14026
-                .unwrap_or(false);
14079
+            let actual_is_proc = actual_is_procedure_slots.get(idx).copied().unwrap_or(false);
1402714080
             // A procedure-name actual binds only to a procedure formal;
1402814081
             // sema rejects any other use, so by the time we reach
1402914082
             // dispatch we can trust that pairing and skip type matching.
@@ -14100,8 +14153,8 @@ fn formal_declared_rank(decl_sym: &crate::sema::symtab::Symbol) -> Option<usize>
1410014153
 
1410114154
 fn formal_rank_matches_actual(formal: Option<usize>, actual: Option<usize>) -> bool {
1410214155
     match (formal, actual) {
14103
-        (None, _) => true,           // assumed-rank — accepts anything
14104
-        (Some(_), None) => true,     // unknown actual rank — don't penalize
14156
+        (None, _) => true,       // assumed-rank — accepts anything
14157
+        (Some(_), None) => true, // unknown actual rank — don't penalize
1410514158
         (Some(f), Some(a)) => f == a,
1410614159
     }
1410714160
 }
@@ -14156,7 +14209,9 @@ fn actual_expr_rank(
1415614209
                     if local_is_array_like(info) {
1415714210
                         let n_ranges = args
1415814211
                             .iter()
14159
-                            .filter(|a| matches!(a.value, crate::ast::expr::SectionSubscript::Range { .. }))
14212
+                            .filter(|a| {
14213
+                                matches!(a.value, crate::ast::expr::SectionSubscript::Range { .. })
14214
+                            })
1416014215
                             .count();
1416114216
                         if n_ranges == 0 && !args.is_empty() {
1416214217
                             return Some(0); // scalar element access
@@ -14259,9 +14314,7 @@ fn resolve_bound_proc_actuals<'a>(
1425914314
     let actual_ranks: Vec<Option<usize>> = args
1426014315
         .iter()
1426114316
         .map(|arg| match &arg.value {
14262
-            crate::ast::expr::SectionSubscript::Element(expr) => {
14263
-                actual_expr_rank(expr, locals, st)
14264
-            }
14317
+            crate::ast::expr::SectionSubscript::Element(expr) => actual_expr_rank(expr, locals, st),
1426514318
             _ => None,
1426614319
         })
1426714320
         .collect();
@@ -14297,14 +14350,16 @@ fn resolve_bound_proc_actuals<'a>(
1429714350
             .iter()
1429814351
             .enumerate()
1429914352
             .filter(|(idx, _)| *idx >= formal_skip)
14300
-            .all(|(idx, declared_arg)| match declared_arg.type_info.as_ref() {
14301
-                Some(declared_type) => generic_declared_semantic_match(
14302
-                    declared_type,
14303
-                    semantic_slots.get(idx).and_then(|slot| slot.as_ref()),
14304
-                    type_layouts,
14305
-                ),
14306
-                None => true,
14307
-            });
14353
+            .all(
14354
+                |(idx, declared_arg)| match declared_arg.type_info.as_ref() {
14355
+                    Some(declared_type) => generic_declared_semantic_match(
14356
+                        declared_type,
14357
+                        semantic_slots.get(idx).and_then(|slot| slot.as_ref()),
14358
+                        type_layouts,
14359
+                    ),
14360
+                    None => true,
14361
+                },
14362
+            );
1430814363
         let ir_match = generic_candidate_matches_slots_with_formal_skip(
1430914364
             b,
1431014365
             &declared_args,
@@ -14349,12 +14404,8 @@ fn resolve_bound_proc_actuals<'a>(
1434914404
         };
1435014405
         let declared_args = declared_args_for_scope(scope);
1435114406
         let formal_skip = if bp.nopass { 0 } else { 1 };
14352
-        let rank_slots = reorder_actual_ranks_by_formal_skip(
14353
-            args,
14354
-            &actual_ranks,
14355
-            &scope.arg_order,
14356
-            formal_skip,
14357
-        );
14407
+        let rank_slots =
14408
+            reorder_actual_ranks_by_formal_skip(args, &actual_ranks, &scope.arg_order, formal_skip);
1435814409
         let mut all_match = true;
1435914410
         let mut any_constraint = false;
1436014411
         for (idx, declared_arg) in declared_args.iter().enumerate() {
@@ -14413,7 +14464,16 @@ fn resolved_bound_proc_for_call<'a>(
1441314464
             _ => b.const_i32(0),
1441414465
         })
1441514466
         .collect();
14416
-    resolve_bound_proc_actuals(st, b, locals, layout, component, args, &probe_vals, type_layouts)
14467
+    resolve_bound_proc_actuals(
14468
+        st,
14469
+        b,
14470
+        locals,
14471
+        layout,
14472
+        component,
14473
+        args,
14474
+        &probe_vals,
14475
+        type_layouts,
14476
+    )
1441714477
 }
1441814478
 
1441914479
 fn fail_unmatched_bound_proc_resolution(
@@ -14533,24 +14593,23 @@ fn assignment_expr_type_info(
1453314593
                         };
1453414594
                         let arg_set: std::collections::HashSet<String> =
1453514595
                             scope.arg_order.iter().map(|n| n.to_lowercase()).collect();
14536
-                        let result_ti = scope
14537
-                            .symbols
14538
-                            .iter()
14539
-                            .find_map(|(key, s)| {
14540
-                                if arg_set.contains(key) {
14541
-                                    return None;
14542
-                                }
14543
-                                if matches!(
14544
-                                    s.kind,
14545
-                                    crate::sema::symtab::SymbolKind::Variable
14546
-                                        | crate::sema::symtab::SymbolKind::Parameter
14547
-                                ) {
14548
-                                    s.type_info.clone()
14549
-                                } else {
14550
-                                    None
14551
-                                }
14552
-                            });
14553
-                        let Some(t) = result_ti else { return None; };
14596
+                        let result_ti = scope.symbols.iter().find_map(|(key, s)| {
14597
+                            if arg_set.contains(key) {
14598
+                                return None;
14599
+                            }
14600
+                            if matches!(
14601
+                                s.kind,
14602
+                                crate::sema::symtab::SymbolKind::Variable
14603
+                                    | crate::sema::symtab::SymbolKind::Parameter
14604
+                            ) {
14605
+                                s.type_info.clone()
14606
+                            } else {
14607
+                                None
14608
+                            }
14609
+                        });
14610
+                        let Some(t) = result_ti else {
14611
+                            return None;
14612
+                        };
1455414613
                         match &common {
1455514614
                             None => common = Some(t),
1455614615
                             Some(c) => {
@@ -14571,10 +14630,7 @@ fn assignment_expr_type_info(
1457114630
     }
1457214631
 }
1457314632
 
14574
-fn same_type_info(
14575
-    a: &crate::sema::symtab::TypeInfo,
14576
-    b: &crate::sema::symtab::TypeInfo,
14577
-) -> bool {
14633
+fn same_type_info(a: &crate::sema::symtab::TypeInfo, b: &crate::sema::symtab::TypeInfo) -> bool {
1457814634
     use crate::sema::symtab::TypeInfo;
1457914635
     match (a, b) {
1458014636
         (TypeInfo::Derived(a), TypeInfo::Derived(b)) => a.eq_ignore_ascii_case(b),
@@ -14733,12 +14789,16 @@ fn generic_declared_semantic_match(
1473314789
     };
1473414790
 
1473514791
     match declared {
14736
-        TypeInfo::Integer { kind: declared_kind } => matches!(
14792
+        TypeInfo::Integer {
14793
+            kind: declared_kind,
14794
+        } => matches!(
1473714795
             actual,
1473814796
             TypeInfo::Integer { kind: actual_kind }
1473914797
                 if intrinsic_kind_matches(*declared_kind, *actual_kind)
1474014798
         ),
14741
-        TypeInfo::Real { kind: declared_kind } => match actual {
14799
+        TypeInfo::Real {
14800
+            kind: declared_kind,
14801
+        } => match actual {
1474214802
             TypeInfo::Real { kind: actual_kind } => {
1474314803
                 intrinsic_kind_matches(*declared_kind, *actual_kind)
1474414804
             }
@@ -14747,17 +14807,18 @@ fn generic_declared_semantic_match(
1474714807
         },
1474814808
         TypeInfo::DoublePrecision => matches!(
1474914809
             actual,
14750
-            TypeInfo::DoublePrecision
14751
-                | TypeInfo::Real {
14752
-                    kind: Some(8),
14753
-                }
14810
+            TypeInfo::DoublePrecision | TypeInfo::Real { kind: Some(8) }
1475414811
         ),
14755
-        TypeInfo::Complex { kind: declared_kind } => matches!(
14812
+        TypeInfo::Complex {
14813
+            kind: declared_kind,
14814
+        } => matches!(
1475614815
             actual,
1475714816
             TypeInfo::Complex { kind: actual_kind }
1475814817
                 if intrinsic_kind_matches(*declared_kind, *actual_kind)
1475914818
         ),
14760
-        TypeInfo::Logical { kind: declared_kind } => matches!(
14819
+        TypeInfo::Logical {
14820
+            kind: declared_kind,
14821
+        } => matches!(
1476114822
             actual,
1476214823
             TypeInfo::Logical { kind: actual_kind }
1476314824
                 if intrinsic_kind_matches(*declared_kind, *actual_kind)
@@ -14770,8 +14831,7 @@ fn generic_declared_semantic_match(
1477014831
         TypeInfo::Class(decl_name) => match actual {
1477114832
             TypeInfo::Derived(actual_name) | TypeInfo::Class(actual_name) => {
1477214833
                 actual_name.eq_ignore_ascii_case(decl_name)
14773
-                    || type_layouts
14774
-                        .is_some_and(|tl| is_type_or_extends(actual_name, decl_name, tl))
14834
+                    || type_layouts.is_some_and(|tl| is_type_or_extends(actual_name, decl_name, tl))
1477514835
             }
1477614836
             _ => false,
1477714837
         },
@@ -14789,9 +14849,7 @@ fn generic_declared_semantic_match(
1478914849
     }
1479014850
 }
1479114851
 
14792
-fn local_semantic_type_info(
14793
-    info: &LocalInfo,
14794
-) -> Option<crate::sema::symtab::TypeInfo> {
14852
+fn local_semantic_type_info(info: &LocalInfo) -> Option<crate::sema::symtab::TypeInfo> {
1479514853
     use crate::sema::symtab::TypeInfo;
1479614854
 
1479714855
     if let Some(type_name) = &info.derived_type {
@@ -14805,10 +14863,7 @@ fn local_semantic_type_info(
1480514863
             CharKind::Fixed(len) => Some(len),
1480614864
             _ => None,
1480714865
         };
14808
-        return Some(TypeInfo::Character {
14809
-            len,
14810
-            kind: Some(1),
14811
-        });
14866
+        return Some(TypeInfo::Character { len, kind: Some(1) });
1481214867
     }
1481314868
 
1481414869
     // Detect complex element type. Complex values are stored as
@@ -14896,12 +14951,8 @@ fn name_expr_type_info(
1489614951
     // declared elsewhere in the same compilation unit.
1489714952
     let is_polymorphic_local = info.is_some_and(|i| i.is_class);
1489814953
     match (local_ti, symbol_ti) {
14899
-        (Some(_), Some(TypeInfo::ClassStar)) if is_polymorphic_local => {
14900
-            Some(TypeInfo::ClassStar)
14901
-        }
14902
-        (Some(_), Some(TypeInfo::TypeStar)) if is_polymorphic_local => {
14903
-            Some(TypeInfo::TypeStar)
14904
-        }
14954
+        (Some(_), Some(TypeInfo::ClassStar)) if is_polymorphic_local => Some(TypeInfo::ClassStar),
14955
+        (Some(_), Some(TypeInfo::TypeStar)) if is_polymorphic_local => Some(TypeInfo::TypeStar),
1490514956
         (Some(local), _) => Some(local),
1490614957
         (None, Some(ti)) => Some(ti.clone()),
1490714958
         (None, None) => None,
@@ -14939,9 +14990,7 @@ fn derived_constructor_type_info(
1493914990
     st: &SymbolTable,
1494014991
 ) -> Option<crate::sema::symtab::TypeInfo> {
1494114992
     let key = callee_name.to_ascii_lowercase();
14942
-    let sym = st
14943
-        .lookup(&key)
14944
-        .or_else(|| st.find_symbol_any_scope(&key))?;
14993
+    let sym = st.lookup(&key).or_else(|| st.find_symbol_any_scope(&key))?;
1494514994
     if sym.kind == crate::sema::symtab::SymbolKind::DerivedType {
1494614995
         Some(
1494714996
             sym.type_info
@@ -14992,7 +15041,8 @@ fn operator_expr_type_info(
1499215041
         }
1499315042
         Expr::Name { name } => {
1499415043
             let key = name.to_lowercase();
14995
-            let symbol_ti = st.lookup(&key)
15044
+            let symbol_ti = st
15045
+                .lookup(&key)
1499615046
                 .and_then(|sym| sym.type_info.clone())
1499715047
                 .or_else(|| {
1499815048
                     st.find_symbol_any_scope(&key)
@@ -15044,9 +15094,7 @@ fn operator_expr_type_info(
1504415094
                     .or_else(|| generic_function_call_type_info(expr, locals, st, type_layouts))
1504515095
                     .or_else(|| local_intrinsic_call_type_info(expr, locals, st, type_layouts))
1504615096
                     .or_else(|| derived_constructor_type_info(name, st))
15047
-                    .or_else(|| {
15048
-                        fortran_type_to_type_info(&crate::sema::types::expr_type(expr, st))
15049
-                    })
15097
+                    .or_else(|| fortran_type_to_type_info(&crate::sema::types::expr_type(expr, st)))
1505015098
             } else {
1505115099
                 None
1505215100
             }
@@ -15193,7 +15241,8 @@ fn generic_actual_expr_type_info(
1519315241
     match &expr.node {
1519415242
         Expr::Name { name } => {
1519515243
             let key = name.to_lowercase();
15196
-            let symbol_ti = st.lookup(&key)
15244
+            let symbol_ti = st
15245
+                .lookup(&key)
1519715246
                 .and_then(|sym| sym.type_info.clone())
1519815247
                 .or_else(|| {
1519915248
                     st.find_symbol_any_scope(&key)
@@ -15358,11 +15407,16 @@ fn array_expr_elem_type_only(
1535815407
             if (left_arr.is_some() || right_arr.is_some())
1535915408
                 && matches!(
1536015409
                     op,
15361
-                    BinaryOp::Eq | BinaryOp::Ne
15362
-                        | BinaryOp::Lt | BinaryOp::Le
15363
-                        | BinaryOp::Gt | BinaryOp::Ge
15364
-                        | BinaryOp::And | BinaryOp::Or
15365
-                        | BinaryOp::Eqv | BinaryOp::Neqv
15410
+                    BinaryOp::Eq
15411
+                        | BinaryOp::Ne
15412
+                        | BinaryOp::Lt
15413
+                        | BinaryOp::Le
15414
+                        | BinaryOp::Gt
15415
+                        | BinaryOp::Ge
15416
+                        | BinaryOp::And
15417
+                        | BinaryOp::Or
15418
+                        | BinaryOp::Eqv
15419
+                        | BinaryOp::Neqv
1536615420
                 )
1536715421
             {
1536815422
                 return Some(IrType::Bool);
@@ -15551,13 +15605,12 @@ fn try_defined_assignment(
1555115605
     // where_at (`set_cwd ` padded to 32, low bytes spaces, hex
1555215606
     // 0x2020...20$). Crashed every fs example via set_cwd's
1555315607
     // error_handling path.
15554
-    let lhs_val = if lhs_info.by_ref
15555
-        && (lhs_info.is_class || local_uses_array_descriptor(&lhs_info))
15556
-    {
15557
-        b.load(lhs_info.addr)
15558
-    } else {
15559
-        lhs_info.addr
15560
-    };
15608
+    let lhs_val =
15609
+        if lhs_info.by_ref && (lhs_info.is_class || local_uses_array_descriptor(&lhs_info)) {
15610
+            b.load(lhs_info.addr)
15611
+        } else {
15612
+            lhs_info.addr
15613
+        };
1556115614
 
1556215615
     // The semantic_candidates filter above already proved that at
1556315616
     // least one specific in `interface assignment(=)` matches both
@@ -15699,7 +15752,10 @@ fn try_defined_assignment(
1569915752
     // the slot returns the literal byte pattern instead of the real
1570015753
     // data address.
1570115754
     let mask = cached_param_mask_for_lookup(ctx.st, ctx.char_len_star_params, &rk);
15702
-    let rhs_is_char_star = mask.as_ref().and_then(|m| m.get(1).copied()).unwrap_or(false);
15755
+    let rhs_is_char_star = mask
15756
+        .as_ref()
15757
+        .and_then(|m| m.get(1).copied())
15758
+        .unwrap_or(false);
1570315759
     let rhs_for_call_final = if rhs_is_char_star {
1570415760
         lower_char_arg_by_ref(
1570515761
             b,
@@ -16045,9 +16101,8 @@ fn emit_resolved_operator_call(
1604516101
         first_procedure_lookup(&abi_lookup_keys, |k| callee_class_arg_mask(st, k));
1604616102
     let callee_char_len_star_args =
1604716103
         first_procedure_lookup(&abi_lookup_keys, |k| callee_char_len_star_mask(st, k));
16048
-    let hidden_result = hidden_abi.and_then(|abi| {
16049
-        allocate_hidden_result_buffer(b, st, type_layouts, &abi_lookup_keys, abi)
16050
-    });
16104
+    let hidden_result = hidden_abi
16105
+        .and_then(|abi| allocate_hidden_result_buffer(b, st, type_layouts, &abi_lookup_keys, abi));
1605116106
 
1605216107
     let mut call_args = Vec::with_capacity(2 + hidden_result.is_some() as usize + 4);
1605316108
     let mut char_actual_lens = [None, None];
@@ -16518,10 +16573,7 @@ fn scope_matches_procedure_name(scope: &crate::sema::symtab::Scope, name: &str)
1651816573
     )
1651916574
 }
1652016575
 
16521
-fn scope_has_linkable_parent(
16522
-    st: &SymbolTable,
16523
-    scope_id: crate::sema::symtab::ScopeId,
16524
-) -> bool {
16576
+fn scope_has_linkable_parent(st: &SymbolTable, scope_id: crate::sema::symtab::ScopeId) -> bool {
1652516577
     let Some(parent_id) = st.scope(scope_id).parent else {
1652616578
         return false;
1652716579
     };
@@ -16570,9 +16622,7 @@ fn find_procedure_scope_id_for_caller(
1657016622
     while let Some(cur_id) = cur {
1657116623
         let cur_scope = st.scope(cur_id);
1657216624
         // Self-match (recursive call to caller itself).
16573
-        if scope_matches_procedure_name(cur_scope, name)
16574
-            && scope_has_linkable_parent(st, cur_id)
16575
-        {
16625
+        if scope_matches_procedure_name(cur_scope, name) && scope_has_linkable_parent(st, cur_id) {
1657616626
             return Some(cur_id);
1657716627
         }
1657816628
         // Sibling/host-contained match: any procedure scope whose
@@ -16656,9 +16706,7 @@ fn lowered_scope_symbol_name(
1665616706
                             .iter()
1665716707
                             .find(|u| u.is_submodule_access)
1665816708
                             .and_then(|u| match &st.scope(u.source_scope).kind {
16659
-                                crate::sema::symtab::ScopeKind::Module(n) => {
16660
-                                    Some(n.to_lowercase())
16661
-                                }
16709
+                                crate::sema::symtab::ScopeKind::Module(n) => Some(n.to_lowercase()),
1666216710
                                 _ => None,
1666316711
                             });
1666416712
                         if let Some(parent_lc) = parent_lc {
@@ -16701,8 +16749,7 @@ fn same_unit_func_ref(
1670116749
     // in the sort submodule), so `int32_increase_sort`'s introsort
1670216750
     // would silently call into bitset_large_decrease's helpers.
1670316751
     let caller_scope = current_proc_scope();
16704
-    let Some(scope_id) = find_procedure_scope_id_for_caller(st, matched_key, caller_scope)
16705
-    else {
16752
+    let Some(scope_id) = find_procedure_scope_id_for_caller(st, matched_key, caller_scope) else {
1670616753
         return FuncRef::External(fallback_call_name);
1670716754
     };
1670816755
     let Some(lowered) = lowered_scope_symbol_name(st, internal_funcs, scope_id) else {
@@ -16733,9 +16780,7 @@ fn symbol_link_name(st: &SymbolTable, sym: &crate::sema::symtab::Symbol) -> Stri
1673316780
                         .iter()
1673416781
                         .find(|u| u.is_submodule_access)
1673516782
                         .and_then(|u| match &st.scope(u.source_scope).kind {
16736
-                            crate::sema::symtab::ScopeKind::Module(n) => {
16737
-                                Some(n.to_lowercase())
16738
-                            }
16783
+                            crate::sema::symtab::ScopeKind::Module(n) => Some(n.to_lowercase()),
1673916784
                             _ => None,
1674016785
                         })
1674116786
                     {
@@ -17417,8 +17462,8 @@ fn emit_resolved_bound_proc_call(
1741717462
                         // the caller (the memcpy-and-stamp polymorphic
1741817463
                         // view would otherwise hide callee writes
1741917464
                         // behind a copy).
17420
-                        let force_box = wants_polymorphic_descriptor
17421
-                            && !matches!(e.node, Expr::Name { .. });
17465
+                        let force_box =
17466
+                            wants_polymorphic_descriptor && !matches!(e.node, Expr::Name { .. });
1742217467
                         lower_arg_descriptor(b, locals, e, st, type_layouts, force_box)
1742317468
                     } else if wants_string_descriptor {
1742417469
                         lower_arg_string_descriptor(b, locals, e, st, type_layouts)
@@ -17527,7 +17572,12 @@ fn emit_resolved_bound_proc_call(
1752717572
     let call_result = b.call(func_ref, call_args, ret_ty);
1752817573
     if let Some(tl) = type_layouts {
1752917574
         if let Some(type_name) = callee_return_stabilized_derived_type_name(st, &target_key) {
17530
-            return Some(stabilize_derived_call_result(b, tl, &type_name, call_result));
17575
+            return Some(stabilize_derived_call_result(
17576
+                b,
17577
+                tl,
17578
+                &type_name,
17579
+                call_result,
17580
+            ));
1753117581
         }
1753217582
     }
1753317583
     Some(call_result)
@@ -17571,21 +17621,19 @@ fn emit_dynamic_bound_proc_lookup_dispatch(
1757117621
         component,
1757217622
         &declared_bp.abi_name,
1757317623
     );
17574
-    let slot_index = base_layout
17575
-        .bound_procs
17576
-        .iter()
17577
-        .position(|bp| {
17578
-            bp.method_name.eq_ignore_ascii_case(component)
17579
-                && bp.abi_name.eq_ignore_ascii_case(&declared_bp.abi_name)
17580
-        })? as i64;
17624
+    let slot_index = base_layout.bound_procs.iter().position(|bp| {
17625
+        bp.method_name.eq_ignore_ascii_case(component)
17626
+            && bp.abi_name.eq_ignore_ascii_case(&declared_bp.abi_name)
17627
+    })? as i64;
1758117628
     let call_ret_ty = if let Some(ret_ty) = explicit_ret_ty {
1758217629
         ret_ty
1758317630
     } else {
1758417631
         let target_key = abi_key_for_link_name(st, &declared_bp.target_name)
1758517632
             .unwrap_or_else(|| declared_bp.abi_name.clone());
17586
-        first_procedure_lookup(&procedure_abi_lookup_keys(st, &[declared_bp.target_name.as_str(), &target_key]), |k| {
17587
-            callee_return_ir_type(st, k)
17588
-        })
17633
+        first_procedure_lookup(
17634
+            &procedure_abi_lookup_keys(st, &[declared_bp.target_name.as_str(), &target_key]),
17635
+            |k| callee_return_ir_type(st, k),
17636
+        )
1758917637
         .unwrap_or(IrType::Int(IntWidth::I32))
1759017638
     };
1759117639
     let returns_value = call_ret_ty != IrType::Void;
@@ -17764,21 +17812,14 @@ fn resolve_polymorphic_component_method_base_for_dispatch(
1776417812
                         .and_then(|sym| sym.type_info.as_ref())
1776517813
                 })?;
1776617814
             let base_type = match type_info {
17767
-                crate::sema::symtab::TypeInfo::Class(base_type) => canonical_layout_type_name_for_scope(
17768
-                    st,
17769
-                    proc_scope_id,
17770
-                    base_type,
17771
-                    tl,
17772
-                )
17773
-                .or_else(|| Some(base_type.clone()))?,
17815
+                crate::sema::symtab::TypeInfo::Class(base_type) => {
17816
+                    canonical_layout_type_name_for_scope(st, proc_scope_id, base_type, tl)
17817
+                        .or_else(|| Some(base_type.clone()))?
17818
+                }
1777417819
                 crate::sema::symtab::TypeInfo::Derived(base_type) => {
17775
-                    let layout_name = canonical_layout_type_name_for_scope(
17776
-                        st,
17777
-                        proc_scope_id,
17778
-                        base_type,
17779
-                        tl,
17780
-                    )
17781
-                    .or_else(|| Some(base_type.clone()))?;
17820
+                    let layout_name =
17821
+                        canonical_layout_type_name_for_scope(st, proc_scope_id, base_type, tl)
17822
+                            .or_else(|| Some(base_type.clone()))?;
1778217823
                     tl.get(&layout_name)
1778317824
                         .filter(|layout| layout.is_abstract)
1778417825
                         .map(|_| layout_name)?
@@ -17786,7 +17827,8 @@ fn resolve_polymorphic_component_method_base_for_dispatch(
1778617827
                 _ => return None,
1778717828
             };
1778817829
             let desc_addr = array_descriptor_addr(b, info);
17789
-            let obj_addr = b.load_typed(desc_addr, IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))));
17830
+            let obj_addr =
17831
+                b.load_typed(desc_addr, IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))));
1779017832
             Some((desc_addr, obj_addr, base_type))
1779117833
         }
1779217834
         Expr::ComponentAccess { .. } => {
@@ -17799,7 +17841,8 @@ fn resolve_polymorphic_component_method_base_for_dispatch(
1779917841
                 return None;
1780017842
             }
1780117843
             let base_type = abstract_layout_base_type(tl, &field.type_info)?;
17802
-            let obj_addr = b.load_typed(desc_addr, IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))));
17844
+            let obj_addr =
17845
+                b.load_typed(desc_addr, IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))));
1780317846
             Some((desc_addr, obj_addr, base_type))
1780417847
         }
1780517848
         _ => None,
@@ -19157,7 +19200,8 @@ fn arg_type_from_decls(
1915719200
     decls: &[crate::ast::decl::SpannedDecl],
1915819201
     st: Option<&SymbolTable>,
1915919202
 ) -> IrType {
19160
-    let local_param_consts = st.map(|st| collect_decl_param_consts_with_scope(decls, &HashMap::new(), st));
19203
+    let local_param_consts =
19204
+        st.map(|st| collect_decl_param_consts_with_scope(decls, &HashMap::new(), st));
1916119205
     if let Some(type_spec) = declared_type_spec_for_name(arg_name, decls) {
1916219206
         return lower_type_spec_with_param_consts(type_spec, local_param_consts.as_ref(), st);
1916319207
     }
@@ -19369,9 +19413,7 @@ fn install_assumed_shape_lower_overrides(
1936919413
         // because we only redirect `info.addr` to the local copy on
1937019414
         // the present path; the original null stays in the slot when
1937119415
         // absent).
19372
-        let entity_is_optional = attrs
19373
-            .iter()
19374
-            .any(|a| matches!(a, Attribute::Optional));
19416
+        let entity_is_optional = attrs.iter().any(|a| matches!(a, Attribute::Optional));
1937519417
         for entity in entities {
1937619418
             let key = entity.name.to_lowercase();
1937719419
             let Some(info) = locals.get(&key) else {
@@ -19401,8 +19443,9 @@ fn install_assumed_shape_lower_overrides(
1940119443
                     // decls reaching this pass. For non-allocatable,
1940219444
                     // non-pointer dummies (already filtered above) this
1940319445
                     // means assumed-shape with default lower bound = 1.
19404
-                    ArraySpec::Deferred
19405
-                    | ArraySpec::AssumedShape { lower: None } => Some(LowerTarget::One),
19446
+                    ArraySpec::Deferred | ArraySpec::AssumedShape { lower: None } => {
19447
+                        Some(LowerTarget::One)
19448
+                    }
1940619449
                     ArraySpec::AssumedShape { lower: Some(e) } => {
1940719450
                         match eval_const_scalar(e, visible_param_consts) {
1940819451
                             Some(ConstScalar::Int(1)) => Some(LowerTarget::One),
@@ -19422,10 +19465,7 @@ fn install_assumed_shape_lower_overrides(
1942219465
 
1942319466
             let slot = info.addr;
1942419467
             let original_desc_ptr = b.load(slot);
19425
-            let local_desc = b.alloca(IrType::Array(
19426
-                Box::new(IrType::Int(IntWidth::I8)),
19427
-                384,
19428
-            ));
19468
+            let local_desc = b.alloca(IrType::Array(Box::new(IrType::Int(IntWidth::I8)), 384));
1942919469
 
1943019470
             // For optional dummies, the actual may be absent — caller
1943119471
             // passes a null descriptor pointer in that case. Guard the
@@ -19458,13 +19498,8 @@ fn install_assumed_shape_lower_overrides(
1945819498
                 let new_lo_i64 = match target {
1945919499
                     LowerTarget::One => b.const_i64(1),
1946019500
                     LowerTarget::Expr(e) => {
19461
-                        let raw = lower_expr_with_optional_layouts(
19462
-                            b,
19463
-                            locals,
19464
-                            e,
19465
-                            st,
19466
-                            Some(type_layouts),
19467
-                        );
19501
+                        let raw =
19502
+                            lower_expr_with_optional_layouts(b, locals, e, st, Some(type_layouts));
1946819503
                         match b.func().value_type(raw) {
1946919504
                             Some(IrType::Int(IntWidth::I64)) => raw,
1947019505
                             _ => b.int_extend(raw, IntWidth::I64, true),
@@ -19573,10 +19608,7 @@ fn install_explicit_shape_dummy_rebase(
1957319608
             let rank = specs.len() as i32;
1957419609
             let slot = info.addr;
1957519610
             let original_desc_ptr = b.load(slot);
19576
-            let local_desc = b.alloca(IrType::Array(
19577
-                Box::new(IrType::Int(IntWidth::I8)),
19578
-                384,
19579
-            ));
19611
+            let local_desc = b.alloca(IrType::Array(Box::new(IrType::Int(IntWidth::I8)), 384));
1958019612
             let bytes = b.const_i64(384);
1958119613
             b.call(
1958219614
                 FuncRef::External("memcpy".into()),
@@ -19796,7 +19828,10 @@ fn allocate_runtime_shape_array_result(
1979619828
 
1979719829
     let rank = specs.len() as u64;
1979819830
     let bounds_bytes = rank * 24;
19799
-    let bounds = b.alloca(IrType::Array(Box::new(IrType::Int(IntWidth::I8)), bounds_bytes));
19831
+    let bounds = b.alloca(IrType::Array(
19832
+        Box::new(IrType::Int(IntWidth::I8)),
19833
+        bounds_bytes,
19834
+    ));
1980019835
     let one64 = b.const_i64(1);
1980119836
     for (i, (lo, hi)) in lowers.iter().zip(uppers.iter()).enumerate() {
1980219837
         let off_lo = b.const_i64((i as i64) * 24);
@@ -19847,10 +19882,7 @@ fn arg_derived_type_name(
1984719882
     None
1984819883
 }
1984919884
 
19850
-fn decl_is_class(
19851
-    name: &str,
19852
-    decls: &[crate::ast::decl::SpannedDecl],
19853
-) -> bool {
19885
+fn decl_is_class(name: &str, decls: &[crate::ast::decl::SpannedDecl]) -> bool {
1985419886
     let key = name.to_lowercase();
1985519887
     for decl in decls {
1985619888
         if let Decl::TypeDecl {
@@ -20499,7 +20531,7 @@ fn install_host_ref_locals(
2049920531
                 is_pointer: info.is_pointer,
2050020532
                 runtime_dim_upper: vec![],
2050120533
                 is_class: false,
20502
-            logical_kind: None,
20534
+                logical_kind: None,
2050320535
                 last_dim_assumed_size: false,
2050420536
             },
2050520537
         );
@@ -20509,7 +20541,10 @@ fn install_host_ref_locals(
2050920541
 /// Check if a callee has VALUE-attributed arguments via its scope in the symbol table.
2051020542
 /// Returns a Vec<bool> per argument position — true if that arg is VALUE.
2051120543
 /// Returns None if callee scope not found or no VALUE args.
20512
-fn callee_scope_id_for_lookup(st: &SymbolTable, callee_name: &str) -> Option<crate::sema::symtab::ScopeId> {
20544
+fn callee_scope_id_for_lookup(
20545
+    st: &SymbolTable,
20546
+    callee_name: &str,
20547
+) -> Option<crate::sema::symtab::ScopeId> {
2051320548
     use crate::sema::symtab::{ScopeKind, SymbolKind};
2051420549
 
2051520550
     let mut name_match = None;
@@ -21003,15 +21038,8 @@ fn resolved_named_character_return_abi_for_call(
2100321038
             _ => b.const_i32(0),
2100421039
         })
2100521040
         .collect();
21006
-    let resolved = resolve_generic_call_actuals(
21007
-        st,
21008
-        b,
21009
-        Some(locals),
21010
-        &key,
21011
-        args,
21012
-        &probe_vals,
21013
-        type_layouts,
21014
-    )?;
21041
+    let resolved =
21042
+        resolve_generic_call_actuals(st, b, Some(locals), &key, args, &probe_vals, type_layouts)?;
2101521043
     callee_character_return_abi(st, &resolved.name)
2101621044
 }
2101721045
 
@@ -22030,8 +22058,7 @@ fn lower_string_expr_full(
2203022058
                     right,
2203122059
                     lhs,
2203222060
                     rhs,
22033
-                )
22034
-                {
22061
+                ) {
2203522062
                     let specific_key = specific.to_lowercase();
2203622063
                     let char_abi = callee_character_return_abi(st, &specific_key);
2203722064
                     let result = emit_resolved_operator_call(
@@ -22409,14 +22436,13 @@ fn extract_kind_with_context(
2240922436
     use crate::ast::decl::KindSelector;
2241022437
     use crate::ast::expr::Expr;
2241122438
     match sel {
22412
-        Some(KindSelector::Expr(e)) | Some(KindSelector::Star(e)) => {
22413
-            match &e.node {
22414
-                Expr::IntegerLiteral { text, .. } => text.parse().unwrap_or(default),
22415
-                Expr::Name { name } => named_kind_value(name, None, param_consts, st)
22416
-                    .unwrap_or(default),
22417
-                _ => default,
22439
+        Some(KindSelector::Expr(e)) | Some(KindSelector::Star(e)) => match &e.node {
22440
+            Expr::IntegerLiteral { text, .. } => text.parse().unwrap_or(default),
22441
+            Expr::Name { name } => {
22442
+                named_kind_value(name, None, param_consts, st).unwrap_or(default)
2241822443
             }
22419
-        }
22444
+            _ => default,
22445
+        },
2242022446
         None => default,
2242122447
     }
2242222448
 }
@@ -22789,13 +22815,7 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2278922815
                                     let alloc_bb = b.create_block("scalar_derived_assign_alloc");
2279022816
                                     let copy_bb = b.create_block("scalar_derived_assign_copy");
2279122817
                                     let done_bb = b.create_block("scalar_derived_assign_done");
22792
-                                    b.cond_branch(
22793
-                                        needs_alloc,
22794
-                                        alloc_bb,
22795
-                                        vec![],
22796
-                                        copy_bb,
22797
-                                        vec![],
22798
-                                    );
22818
+                                    b.cond_branch(needs_alloc, alloc_bb, vec![], copy_bb, vec![]);
2279922819
 
2280022820
                                     b.set_block(alloc_bb);
2280122821
                                     if let Some(ref tn) = info.derived_type {
@@ -22905,15 +22925,17 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2290522925
                                                                         .contains(&s.to_lowercase())
2290622926
                                                                         || ctx
2290722927
                                                                             .st
22908
-                                                                            .find_symbol_any_scope(s)
22928
+                                                                            .find_symbol_any_scope(
22929
+                                                                                s,
22930
+                                                                            )
2290922931
                                                                             .is_some_and(|sym| {
2291022932
                                                                                 sym.attrs.elemental
2291122933
                                                                             })
2291222934
                                                                 })
2291322935
                                                         })
2291422936
                                                         .unwrap_or(false);
22915
-                                                let is_elemental = direct_elemental
22916
-                                                    || generic_specifics_elemental;
22937
+                                                let is_elemental =
22938
+                                                    direct_elemental || generic_specifics_elemental;
2291722939
                                                 is_elemental
2291822940
                                                     && call_args.iter().any(|arg| {
2291922941
                                                         matches!(
@@ -22953,8 +22975,7 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2295322975
                                                         // a single complex(4) const-zero
2295422976
                                                         // buffer — wrong shape and wrong kind.
2295522977
                                                         | "cmplx"
22956
-                                                )
22957
-                                                || (
22978
+                                                ) || (
2295822979
                                                     // sum(arr, dim) is rank-N-1: route to
2295922980
                                                     // lower_array_assign so the sum-dim arm
2296022981
                                                     // in lower_array_expr_descriptor fills
@@ -22963,11 +22984,16 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2296322984
                                                     // assignment falls through to scalar
2296422985
                                                     // broadcast.
2296522986
                                                     lname == "sum"
22966
-                                                    && call_args.iter().enumerate().any(|(i, a)| {
22967
-                                                        let kw = a.keyword.as_deref().map(|s| s.to_lowercase());
22968
-                                                        matches!(kw.as_deref(), Some("dim"))
22969
-                                                            || (i == 1 && kw.is_none())
22970
-                                                    })
22987
+                                                        && call_args.iter().enumerate().any(
22988
+                                                            |(i, a)| {
22989
+                                                                let kw = a
22990
+                                                                    .keyword
22991
+                                                                    .as_deref()
22992
+                                                                    .map(|s| s.to_lowercase());
22993
+                                                                matches!(kw.as_deref(), Some("dim"))
22994
+                                                                    || (i == 1 && kw.is_none())
22995
+                                                            },
22996
+                                                        )
2297122997
                                                 )
2297222998
                                             } else {
2297322999
                                                 false
@@ -23012,7 +23038,9 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2301223038
                                                     b.call(
2301323039
                                                         FuncRef::External("memset".into()),
2301423040
                                                         vec![tmp_desc, zero32, sz384],
23015
-                                                        IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))),
23041
+                                                        IrType::Ptr(Box::new(IrType::Int(
23042
+                                                            IntWidth::I8,
23043
+                                                        ))),
2301623044
                                                     );
2301723045
                                                     lower_alloc_return_call_into_desc(
2301823046
                                                         b,
@@ -23022,23 +23050,28 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2302223050
                                                         call_args,
2302323051
                                                     );
2302423052
                                                     let n = array_total_elems_value(b, &info);
23025
-                                                    let elem_bytes = b.const_i64(
23026
-                                                        ir_scalar_byte_size(&info.ty),
23027
-                                                    );
23053
+                                                    let elem_bytes =
23054
+                                                        b.const_i64(ir_scalar_byte_size(&info.ty));
2302823055
                                                     let byte_count = b.imul(n, elem_bytes);
2302923056
                                                     let src_base = b.load_typed(
2303023057
                                                         tmp_desc,
23031
-                                                        IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))),
23058
+                                                        IrType::Ptr(Box::new(IrType::Int(
23059
+                                                            IntWidth::I8,
23060
+                                                        ))),
2303223061
                                                     );
2303323062
                                                     b.call(
2303423063
                                                         FuncRef::External("memcpy".into()),
2303523064
                                                         vec![info.addr, src_base, byte_count],
23036
-                                                        IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))),
23065
+                                                        IrType::Ptr(Box::new(IrType::Int(
23066
+                                                            IntWidth::I8,
23067
+                                                        ))),
2303723068
                                                     );
2303823069
                                                     let stat = b.alloca(IrType::Int(IntWidth::I32));
2303923070
                                                     b.store(zero32, stat);
2304023071
                                                     b.call(
23041
-                                                        FuncRef::External("afs_deallocate_array".into()),
23072
+                                                        FuncRef::External(
23073
+                                                            "afs_deallocate_array".into(),
23074
+                                                        ),
2304223075
                                                         vec![tmp_desc, stat],
2304323076
                                                         IrType::Void,
2304423077
                                                     );
@@ -23061,18 +23094,21 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2306123094
                                                     );
2306223095
                                                 } else {
2306323096
                                                     let n = array_total_elems_value(b, &info);
23064
-                                                    let elem_bytes = b.const_i64(
23065
-                                                        ir_scalar_byte_size(&info.ty),
23066
-                                                    );
23097
+                                                    let elem_bytes =
23098
+                                                        b.const_i64(ir_scalar_byte_size(&info.ty));
2306723099
                                                     let byte_count = b.imul(n, elem_bytes);
2306823100
                                                     let src_base = b.load_typed(
2306923101
                                                         src_desc,
23070
-                                                        IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))),
23102
+                                                        IrType::Ptr(Box::new(IrType::Int(
23103
+                                                            IntWidth::I8,
23104
+                                                        ))),
2307123105
                                                     );
2307223106
                                                     b.call(
2307323107
                                                         FuncRef::External("memcpy".into()),
2307423108
                                                         vec![info.addr, src_base, byte_count],
23075
-                                                        IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))),
23109
+                                                        IrType::Ptr(Box::new(IrType::Int(
23110
+                                                            IntWidth::I8,
23111
+                                                        ))),
2307623112
                                                     );
2307723113
                                                 }
2307823114
                                                 let stat = b.alloca(IrType::Int(IntWidth::I32));
@@ -23092,24 +23128,29 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2309223128
                                             if local_uses_array_descriptor(&info) {
2309323129
                                                 let dest_desc = array_descriptor_addr(b, &info);
2309423130
                                                 b.call(
23095
-                                                    FuncRef::External("afs_assign_allocatable".into()),
23131
+                                                    FuncRef::External(
23132
+                                                        "afs_assign_allocatable".into(),
23133
+                                                    ),
2309623134
                                                     vec![dest_desc, src_desc],
2309723135
                                                     IrType::Void,
2309823136
                                                 );
2309923137
                                             } else {
2310023138
                                                 let n = array_total_elems_value(b, &info);
23101
-                                                let elem_bytes = b.const_i64(
23102
-                                                    ir_scalar_byte_size(&info.ty),
23103
-                                                );
23139
+                                                let elem_bytes =
23140
+                                                    b.const_i64(ir_scalar_byte_size(&info.ty));
2310423141
                                                 let byte_count = b.imul(n, elem_bytes);
2310523142
                                                 let src_base = b.load_typed(
2310623143
                                                     src_desc,
23107
-                                                    IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))),
23144
+                                                    IrType::Ptr(Box::new(IrType::Int(
23145
+                                                        IntWidth::I8,
23146
+                                                    ))),
2310823147
                                                 );
2310923148
                                                 b.call(
2311023149
                                                     FuncRef::External("memcpy".into()),
2311123150
                                                     vec![info.addr, src_base, byte_count],
23112
-                                                    IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))),
23151
+                                                    IrType::Ptr(Box::new(IrType::Int(
23152
+                                                        IntWidth::I8,
23153
+                                                    ))),
2311323154
                                                 );
2311423155
                                             }
2311523156
                                             let stat = b.alloca(IrType::Int(IntWidth::I32));
@@ -23184,7 +23225,8 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2318423225
                                     }
2318523226
                                 } else if info.is_class
2318623227
                                     && info.dims.is_empty()
23187
-                                    && ctx.st
23228
+                                    && ctx
23229
+                                        .st
2318823230
                                         .find_symbol_any_scope(&key)
2318923231
                                         .map(|s| s.attrs.allocatable)
2319023232
                                         .unwrap_or(false)
@@ -23250,8 +23292,9 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2325023292
                                 if let crate::ast::expr::SectionSubscript::Element(idx_expr) =
2325123293
                                     &args[0].value
2325223294
                                 {
23253
-                                    if let Expr::ArrayConstructor { values: idx_values, .. } =
23254
-                                        &idx_expr.node
23295
+                                    if let Expr::ArrayConstructor {
23296
+                                        values: idx_values, ..
23297
+                                    } = &idx_expr.node
2325523298
                                     {
2325623299
                                         for v in idx_values {
2325723300
                                             let crate::ast::expr::AcValue::Expr(scalar_idx) = v
@@ -23299,17 +23342,9 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2329923342
                                     &args[0].value
2330023343
                                 {
2330123344
                                     if !matches!(idx_expr.node, Expr::ArrayConstructor { .. })
23302
-                                        && expr_returns_array(
23303
-                                            idx_expr,
23304
-                                            &ctx.locals,
23305
-                                            ctx.st,
23306
-                                        )
23345
+                                        && expr_returns_array(idx_expr, &ctx.locals, ctx.st)
2330723346
                                         && lower_dynamic_vector_subscript_assign(
23308
-                                            b,
23309
-                                            ctx,
23310
-                                            &info,
23311
-                                            idx_expr,
23312
-                                            value,
23347
+                                            b, ctx, &info, idx_expr, value,
2331323348
                                         )
2331423349
                                     {
2331523350
                                         return;
@@ -23881,29 +23916,24 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2388123916
                                     // Memcpy the source descriptor.  RHS is
2388223917
                                     // expected to be a polymorphic local or
2388323918
                                     // another class(*) component access.
23884
-                                    let src_desc_opt: Option<ValueId> =
23885
-                                        match &value.node {
23886
-                                            Expr::ComponentAccess { .. } => {
23887
-                                                resolve_component_field_access(
23888
-                                                    b,
23889
-                                                    &ctx.locals,
23890
-                                                    value,
23891
-                                                    ctx.st,
23892
-                                                    ctx.type_layouts,
23893
-                                                )
23894
-                                                .map(|(p, _)| p)
23895
-                                            }
23896
-                                            Expr::Name { name } => ctx
23897
-                                                .locals
23898
-                                                .get(&name.to_lowercase())
23899
-                                                .filter(|info| {
23900
-                                                    info.is_class && info.dims.is_empty()
23901
-                                                })
23902
-                                                .map(|info| {
23903
-                                                    array_descriptor_addr(b, info)
23904
-                                                }),
23905
-                                            _ => None,
23906
-                                        };
23919
+                                    let src_desc_opt: Option<ValueId> = match &value.node {
23920
+                                        Expr::ComponentAccess { .. } => {
23921
+                                            resolve_component_field_access(
23922
+                                                b,
23923
+                                                &ctx.locals,
23924
+                                                value,
23925
+                                                ctx.st,
23926
+                                                ctx.type_layouts,
23927
+                                            )
23928
+                                            .map(|(p, _)| p)
23929
+                                        }
23930
+                                        Expr::Name { name } => ctx
23931
+                                            .locals
23932
+                                            .get(&name.to_lowercase())
23933
+                                            .filter(|info| info.is_class && info.dims.is_empty())
23934
+                                            .map(|info| array_descriptor_addr(b, info)),
23935
+                                        _ => None,
23936
+                                    };
2390723937
                                     if let Some(src) = src_desc_opt {
2390823938
                                         let sz = b.const_i64(384);
2390923939
                                         b.call(
@@ -24214,8 +24244,7 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2421424244
                                 .as_ref()
2421524245
                                 .map(|mask| mask.get(i).copied().unwrap_or(false))
2421624246
                                 .unwrap_or(false);
24217
-                        let wants_string_descriptor =
24218
-                            wants_string_descriptor && !wants_bind_c_char;
24247
+                        let wants_string_descriptor = wants_string_descriptor && !wants_bind_c_char;
2421924248
                         let value = match slot {
2422024249
                             Some(arg) => match &arg.value {
2422124250
                                 crate::ast::expr::SectionSubscript::Element(e) => {
@@ -24468,8 +24497,7 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2446824497
                                 .as_ref()
2446924498
                                 .map(|mask| mask.get(i).copied().unwrap_or(false))
2447024499
                                 .unwrap_or(false);
24471
-                        let wants_string_descriptor =
24472
-                            wants_string_descriptor && !wants_bind_c_char;
24500
+                        let wants_string_descriptor = wants_string_descriptor && !wants_bind_c_char;
2447324501
                         let value = match slot {
2447424502
                             Some(arg) => match &arg.value {
2447524503
                                 crate::ast::expr::SectionSubscript::Element(e) => {
@@ -24830,7 +24858,7 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2483024858
                             is_pointer: false,
2483124859
                             runtime_dim_upper: vec![],
2483224860
                             is_class: false,
24833
-            logical_kind: None,
24861
+                            logical_kind: None,
2483424862
                             last_dim_assumed_size: false,
2483524863
                         },
2483624864
                     );
@@ -24994,7 +25022,7 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2499425022
                             is_pointer: false,
2499525023
                             runtime_dim_upper: vec![],
2499625024
                             is_class: false,
24997
-            logical_kind: None,
25025
+                            logical_kind: None,
2499825026
                             last_dim_assumed_size: false,
2499925027
                         },
2500025028
                     );
@@ -25057,8 +25085,12 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2505725085
             ..
2505825086
         } => {
2505925087
             let bb_end = b.create_block("select_type_end");
25060
-            let selector_type =
25061
-                operator_expr_type_info(selector, Some(&ctx.locals), ctx.st, Some(ctx.type_layouts));
25088
+            let selector_type = operator_expr_type_info(
25089
+                selector,
25090
+                Some(&ctx.locals),
25091
+                ctx.st,
25092
+                Some(ctx.type_layouts),
25093
+            );
2506225094
             let selector_info = associate_alias_local_info(b, ctx, selector);
2506325095
             let dynamic_class_selector = selector_info.as_ref().filter(|info| {
2506425096
                 info.derived_type.is_some()
@@ -25171,46 +25203,31 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2517125203
                     let _ = std::io::stderr().flush();
2517225204
                     std::process::exit(1);
2517325205
                 }
25174
-                let static_type = selector_info.as_ref().and_then(|info| info.derived_type.clone());
25206
+                let static_type = selector_info
25207
+                    .as_ref()
25208
+                    .and_then(|info| info.derived_type.clone());
2517525209
                 if let Some(ref type_name) = static_type {
25176
-                if let Some(layout) = ctx.type_layouts.get(type_name) {
25177
-                    let tag_val = b.const_i64(layout.type_tag as i64);
25178
-                    let default_body = guards.iter().find_map(|guard| match guard {
25179
-                        crate::ast::stmt::TypeGuard::ClassDefault { body } => Some(body),
25180
-                        _ => None,
25181
-                    });
25182
-
25183
-                    for guard in guards {
25184
-                        match guard {
25185
-                            crate::ast::stmt::TypeGuard::TypeIs {
25186
-                                type_name: guard_type,
25187
-                                body,
25188
-                            } => {
25189
-                                if let Some(guard_layout) = ctx.type_layouts.get(guard_type) {
25190
-                                    let guard_tag = b.const_i64(guard_layout.type_tag as i64);
25191
-                                    let matches = b.icmp(CmpOp::Eq, tag_val, guard_tag);
25192
-                                    let bb_match = b.create_block("type_is_match");
25193
-                                    let bb_next = b.create_block("type_is_next");
25194
-                                    b.cond_branch(matches, bb_match, vec![], bb_next, vec![]);
25195
-
25196
-                                    b.set_block(bb_match);
25197
-                                    with_select_type_guard_binding(
25198
-                                        b,
25199
-                                        ctx,
25200
-                                        selector,
25201
-                                        assoc_name.as_deref(),
25202
-                                        guard_type,
25203
-                                        |b, ctx| lower_stmts(b, ctx, body),
25204
-                                    );
25205
-                                    if b.func().block(b.current_block()).terminator.is_none() {
25206
-                                        b.branch(bb_end, vec![]);
25207
-                                    }
25210
+                    if let Some(layout) = ctx.type_layouts.get(type_name) {
25211
+                        let tag_val = b.const_i64(layout.type_tag as i64);
25212
+                        let default_body = guards.iter().find_map(|guard| match guard {
25213
+                            crate::ast::stmt::TypeGuard::ClassDefault { body } => Some(body),
25214
+                            _ => None,
25215
+                        });
2520825216
 
25209
-                                    b.set_block(bb_next);
25210
-                                } else {
25211
-                                    // Unknown guard type — skip.
25212
-                                    let tag_matches = type_name.eq_ignore_ascii_case(guard_type);
25213
-                                    if tag_matches {
25217
+                        for guard in guards {
25218
+                            match guard {
25219
+                                crate::ast::stmt::TypeGuard::TypeIs {
25220
+                                    type_name: guard_type,
25221
+                                    body,
25222
+                                } => {
25223
+                                    if let Some(guard_layout) = ctx.type_layouts.get(guard_type) {
25224
+                                        let guard_tag = b.const_i64(guard_layout.type_tag as i64);
25225
+                                        let matches = b.icmp(CmpOp::Eq, tag_val, guard_tag);
25226
+                                        let bb_match = b.create_block("type_is_match");
25227
+                                        let bb_next = b.create_block("type_is_next");
25228
+                                        b.cond_branch(matches, bb_match, vec![], bb_next, vec![]);
25229
+
25230
+                                        b.set_block(bb_match);
2521425231
                                         with_select_type_guard_binding(
2521525232
                                             b,
2521625233
                                             ctx,
@@ -25222,45 +25239,67 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2522225239
                                         if b.func().block(b.current_block()).terminator.is_none() {
2522325240
                                             b.branch(bb_end, vec![]);
2522425241
                                         }
25225
-                                        break;
25242
+
25243
+                                        b.set_block(bb_next);
25244
+                                    } else {
25245
+                                        // Unknown guard type — skip.
25246
+                                        let tag_matches =
25247
+                                            type_name.eq_ignore_ascii_case(guard_type);
25248
+                                        if tag_matches {
25249
+                                            with_select_type_guard_binding(
25250
+                                                b,
25251
+                                                ctx,
25252
+                                                selector,
25253
+                                                assoc_name.as_deref(),
25254
+                                                guard_type,
25255
+                                                |b, ctx| lower_stmts(b, ctx, body),
25256
+                                            );
25257
+                                            if b.func()
25258
+                                                .block(b.current_block())
25259
+                                                .terminator
25260
+                                                .is_none()
25261
+                                            {
25262
+                                                b.branch(bb_end, vec![]);
25263
+                                            }
25264
+                                            break;
25265
+                                        }
2522625266
                                     }
2522725267
                                 }
25228
-                            }
25229
-                            crate::ast::stmt::TypeGuard::ClassIs {
25230
-                                type_name: guard_type,
25231
-                                body,
25232
-                            } => {
25233
-                                // CLASS IS matches the type or any extension.
25234
-                                // Check if static type is or extends the guard type.
25235
-                                let is_match =
25236
-                                    is_type_or_extends(type_name, guard_type, ctx.type_layouts);
25237
-                                if is_match {
25238
-                                    with_select_type_guard_binding(
25239
-                                        b,
25240
-                                        ctx,
25241
-                                        selector,
25242
-                                        assoc_name.as_deref(),
25243
-                                        guard_type,
25244
-                                        |b, ctx| lower_stmts(b, ctx, body),
25245
-                                    );
25246
-                                    if b.func().block(b.current_block()).terminator.is_none() {
25247
-                                        b.branch(bb_end, vec![]);
25268
+                                crate::ast::stmt::TypeGuard::ClassIs {
25269
+                                    type_name: guard_type,
25270
+                                    body,
25271
+                                } => {
25272
+                                    // CLASS IS matches the type or any extension.
25273
+                                    // Check if static type is or extends the guard type.
25274
+                                    let is_match =
25275
+                                        is_type_or_extends(type_name, guard_type, ctx.type_layouts);
25276
+                                    if is_match {
25277
+                                        with_select_type_guard_binding(
25278
+                                            b,
25279
+                                            ctx,
25280
+                                            selector,
25281
+                                            assoc_name.as_deref(),
25282
+                                            guard_type,
25283
+                                            |b, ctx| lower_stmts(b, ctx, body),
25284
+                                        );
25285
+                                        if b.func().block(b.current_block()).terminator.is_none() {
25286
+                                            b.branch(bb_end, vec![]);
25287
+                                        }
25288
+                                        break; // CLASS IS matched, skip remaining guards.
2524825289
                                     }
25249
-                                    break; // CLASS IS matched, skip remaining guards.
2525025290
                                 }
25291
+                                crate::ast::stmt::TypeGuard::ClassDefault { .. } => {}
2525125292
                             }
25252
-                            crate::ast::stmt::TypeGuard::ClassDefault { .. } => {}
2525325293
                         }
25254
-                    }
25255
-                    if let Some(body) = default_body {
25256
-                        lower_stmts(b, ctx, body);
25257
-                        if b.func().block(b.current_block()).terminator.is_none() {
25258
-                            b.branch(bb_end, vec![]);
25294
+                        if let Some(body) = default_body {
25295
+                            lower_stmts(b, ctx, body);
25296
+                            if b.func().block(b.current_block()).terminator.is_none() {
25297
+                                b.branch(bb_end, vec![]);
25298
+                            }
2525925299
                         }
2526025300
                     }
2526125301
                 }
2526225302
             }
25263
-            }
2526425303
 
2526525304
             if b.func().block(b.current_block()).terminator.is_none() {
2526625305
                 b.branch(bb_end, vec![]);
@@ -25470,7 +25509,7 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2547025509
                                 is_pointer: field.pointer,
2547125510
                                 runtime_dim_upper: vec![],
2547225511
                                 is_class: false,
25473
-            logical_kind: None,
25512
+                                logical_kind: None,
2547425513
                                 last_dim_assumed_size: false,
2547525514
                             };
2547625515
                             let source_scalar_layout = if rank == 0 && source_desc.is_none() {
@@ -25487,16 +25526,14 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2548725526
                             } else {
2548825527
                                 None
2548925528
                             };
25490
-                            let dynamic_layout = source_scalar_layout
25491
-                                .or(typed_layout)
25492
-                                .or_else(|| {
25529
+                            let dynamic_layout =
25530
+                                source_scalar_layout.or(typed_layout).or_else(|| {
2549325531
                                     field_info
2549425532
                                         .derived_type
2549525533
                                         .as_deref()
2549625534
                                         .and_then(|type_name| ctx.type_layouts.get(type_name))
2549725535
                                 });
25498
-                            let scalar_source_copy_plan =
25499
-                                if rank == 0 && source_desc.is_none() {
25536
+                            let scalar_source_copy_plan = if rank == 0 && source_desc.is_none() {
2550025537
                                 source_expr.and_then(|expr| {
2550125538
                                     expr_scalar_alloc_source_copy_plan(
2550225539
                                         expr,
@@ -25704,11 +25741,7 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2570425741
                                     })
2570525742
                                 };
2570625743
                                 emit_scalar_alloc_polymorphic_metadata_on_success(
25707
-                                    b,
25708
-                                    stat_addr,
25709
-                                    field_ptr,
25710
-                                    type_tag,
25711
-                                    tbp_lookup,
25744
+                                    b, stat_addr, field_ptr, type_tag, tbp_lookup,
2571225745
                                 );
2571325746
                                 if let Some(source_desc) = source_desc {
2571425747
                                     emit_scalar_alloc_source_descriptor_metadata_on_success(
@@ -25764,7 +25797,7 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2576425797
                                 is_pointer: field.pointer,
2576525798
                                 runtime_dim_upper: vec![],
2576625799
                                 is_class: false,
25767
-            logical_kind: None,
25800
+                                logical_kind: None,
2576825801
                                 last_dim_assumed_size: false,
2576925802
                             };
2577025803
                             let elem_size_bytes =
@@ -25845,15 +25878,13 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2584525878
                             } else {
2584625879
                                 None
2584725880
                             };
25848
-                            let dynamic_layout = source_scalar_layout
25849
-                                .or(typed_layout)
25850
-                                .or_else(|| {
25881
+                            let dynamic_layout =
25882
+                                source_scalar_layout.or(typed_layout).or_else(|| {
2585125883
                                     info.derived_type
2585225884
                                         .as_deref()
2585325885
                                         .and_then(|type_name| ctx.type_layouts.get(type_name))
2585425886
                                 });
25855
-                            let scalar_source_copy_plan =
25856
-                                if rank == 0 && source_desc.is_none() {
25887
+                            let scalar_source_copy_plan = if rank == 0 && source_desc.is_none() {
2585725888
                                 source_expr.and_then(|expr| {
2585825889
                                     expr_scalar_alloc_source_copy_plan(
2585925890
                                         expr,
@@ -26067,11 +26098,7 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2606726098
                                     })
2606826099
                                 };
2606926100
                                 emit_scalar_alloc_polymorphic_metadata_on_success(
26070
-                                    b,
26071
-                                    stat_addr,
26072
-                                    desc,
26073
-                                    type_tag,
26074
-                                    tbp_lookup,
26101
+                                    b, stat_addr, desc, type_tag, tbp_lookup,
2607526102
                                 );
2607626103
                                 if let Some(source_desc) = source_desc {
2607726104
                                     emit_scalar_alloc_source_descriptor_metadata_on_success(
@@ -26202,10 +26229,7 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2620226229
                             // never fires for re-deallocated pools
2620326230
                             // and recurses until stack overflow.
2620426231
                             let null_v = b.const_i64(0);
26205
-                            let null_p = b.int_to_ptr(
26206
-                                null_v,
26207
-                                IrType::Int(IntWidth::I8),
26208
-                            );
26232
+                            let null_p = b.int_to_ptr(null_v, IrType::Int(IntWidth::I8));
2620926233
                             b.store(null_p, field_ptr);
2621026234
                             continue;
2621126235
                         }
@@ -26245,10 +26269,7 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2624526269
                             b.runtime_call(RuntimeFunc::Deallocate, vec![ptr], IrType::Void);
2624626270
                             // Null the pointer slot per F2018 §9.7.3.2.
2624726271
                             let null_v = b.const_i64(0);
26248
-                            let null_p = b.int_to_ptr(
26249
-                                null_v,
26250
-                                IrType::Int(IntWidth::I8),
26251
-                            );
26272
+                            let null_p = b.int_to_ptr(null_v, IrType::Int(IntWidth::I8));
2625226273
                             b.store(null_p, slot);
2625326274
                         } else {
2625426275
                             let ptr = b.load_typed(
@@ -26467,7 +26488,7 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2646726488
                         is_pointer: false,
2646826489
                         runtime_dim_upper: vec![],
2646926490
                         is_class: false,
26470
-            logical_kind: None,
26491
+                        logical_kind: None,
2647126492
                         last_dim_assumed_size: false,
2647226493
                     },
2647326494
                 );
@@ -27299,22 +27320,15 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2729927320
                     let is_remap_target = ctx
2730027321
                         .locals
2730127322
                         .get(&tgt_key)
27302
-                        .map(|info| {
27303
-                            info.is_pointer && local_uses_array_descriptor(info)
27304
-                        })
27323
+                        .map(|info| info.is_pointer && local_uses_array_descriptor(info))
2730527324
                         .unwrap_or(false);
2730627325
                     let all_ranges = !args.is_empty()
2730727326
                         && args.iter().all(|a| {
27308
-                            matches!(
27309
-                                a.value,
27310
-                                crate::ast::expr::SectionSubscript::Range { .. }
27311
-                            )
27327
+                            matches!(a.value, crate::ast::expr::SectionSubscript::Range { .. })
2731227328
                         });
2731327329
                     if is_remap_target
2731427330
                         && all_ranges
27315
-                        && lower_rank_remap_pointer_assignment(
27316
-                            b, ctx, &tgt_key, args, value,
27317
-                        )
27331
+                        && lower_rank_remap_pointer_assignment(b, ctx, &tgt_key, args, value)
2731827332
                     {
2731927333
                         return;
2732027334
                     }
@@ -27447,7 +27461,7 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2744727461
                     is_pointer: tgt_field.pointer,
2744827462
                     runtime_dim_upper: vec![],
2744927463
                     is_class: false,
27450
-            logical_kind: None,
27464
+                    logical_kind: None,
2745127465
                     last_dim_assumed_size: false,
2745227466
                 })
2745327467
                 .or_else(|| {
@@ -27762,12 +27776,7 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2776227776
                         static_expr_tbp_lookup_value(b, value, ctx.st, ctx.type_layouts);
2776327777
                     let tgt_desc = array_descriptor_addr(b, &tgt_info);
2776427778
                     store_scalar_polymorphic_descriptor_view(
27765
-                        b,
27766
-                        tgt_desc,
27767
-                        addr,
27768
-                        elem_size,
27769
-                        type_tag,
27770
-                        tbp_lookup,
27779
+                        b, tgt_desc, addr, elem_size, type_tag, tbp_lookup,
2777127780
                     );
2777227781
                 } else {
2777327782
                     store_scalar_pointer_slot_value(b, &tgt_info, addr);
@@ -27896,16 +27905,10 @@ fn lower_stmt(b: &mut FuncBuilder, ctx: &mut LowerCtx, stmt: &SpannedStmt) {
2789627905
                 let type_tag = static_expr_type_tag_value(b, value, ctx.st, ctx.type_layouts);
2789727906
                 let elem_size = expr_type_layout(value, None, ctx.st, ctx.type_layouts)
2789827907
                     .map(|layout| b.const_i64(layout.size as i64));
27899
-                let tbp_lookup =
27900
-                    static_expr_tbp_lookup_value(b, value, ctx.st, ctx.type_layouts);
27908
+                let tbp_lookup = static_expr_tbp_lookup_value(b, value, ctx.st, ctx.type_layouts);
2790127909
                 let tgt_desc = array_descriptor_addr(b, &tgt_info);
2790227910
                 store_scalar_polymorphic_descriptor_view(
27903
-                    b,
27904
-                    tgt_desc,
27905
-                    addr,
27906
-                    elem_size,
27907
-                    type_tag,
27908
-                    tbp_lookup,
27911
+                    b, tgt_desc, addr, elem_size, type_tag, tbp_lookup,
2790927912
                 );
2791027913
             } else {
2791127914
                 store_scalar_pointer_slot_value(b, &tgt_info, addr);
@@ -28032,7 +28035,8 @@ fn expr_uses_optional_by_ref_local(
2803228035
     match expr {
2803328036
         Expr::Name { name } => {
2803428037
             let key = name.to_lowercase();
28035
-            optional_locals.contains(&key) && locals.get(&key).map(|info| info.by_ref).unwrap_or(false)
28038
+            optional_locals.contains(&key)
28039
+                && locals.get(&key).map(|info| info.by_ref).unwrap_or(false)
2803628040
         }
2803728041
         Expr::BinaryOp { left, right, .. } => {
2803828042
             expr_uses_optional_by_ref_local(&left.node, locals, optional_locals)
@@ -28427,7 +28431,7 @@ fn lower_do_loop(b: &mut FuncBuilder, ctx: &mut LowerCtx, fields: DoLoopFields)
2842728431
                         is_pointer: false,
2842828432
                         runtime_dim_upper: vec![],
2842928433
                         is_class: false,
28430
-            logical_kind: None,
28434
+                        logical_kind: None,
2843128435
                         last_dim_assumed_size: false,
2843228436
                     },
2843328437
                 );
@@ -29449,7 +29453,9 @@ fn lower_runtime_array_constructor_descriptor(
2944929453
 /// folded here — they fall back to silently skipping init the same
2945029454
 /// way they used to (visible if the user mixes them in declared
2945129455
 /// initializers, which is rare).
29452
-fn extract_reshape_source_ac(expr: &crate::ast::expr::Expr) -> Option<&[crate::ast::expr::AcValue]> {
29456
+fn extract_reshape_source_ac(
29457
+    expr: &crate::ast::expr::Expr,
29458
+) -> Option<&[crate::ast::expr::AcValue]> {
2945329459
     use crate::ast::expr::{Expr, SectionSubscript};
2945429460
     let Expr::FunctionCall { callee, args } = expr else {
2945529461
         return None;
@@ -29686,10 +29692,7 @@ fn store_ac_values_at_off(
2968629692
                     // because elem_size==8 matches the scalar store width.
2968729693
                     let bytes = complex_byte_size(elem_ty);
2968829694
                     let sz = b.const_i64(bytes);
29689
-                    let src_ptr = if matches!(
29690
-                        b.func().value_type(raw),
29691
-                        Some(IrType::Ptr(_))
29692
-                    ) {
29695
+                    let src_ptr = if matches!(b.func().value_type(raw), Some(IrType::Ptr(_))) {
2969329696
                         raw
2969429697
                     } else {
2969529698
                         // Value-form complex (e.g. produced by an
@@ -29957,10 +29960,7 @@ fn store_ac_implied_do(
2995729960
                     // scalar store of an Array(F,2) value drops the imag lane.
2995829961
                     let bytes = complex_byte_size(elem_ty);
2995929962
                     let sz = b.const_i64(bytes);
29960
-                    let src_ptr = if matches!(
29961
-                        b.func().value_type(raw),
29962
-                        Some(IrType::Ptr(_))
29963
-                    ) {
29963
+                    let src_ptr = if matches!(b.func().value_type(raw), Some(IrType::Ptr(_))) {
2996429964
                         raw
2996529965
                     } else {
2996629966
                         let buf = b.alloca(elem_ty.clone());
@@ -33423,7 +33423,10 @@ fn lower_descriptor_actual_from_info(
3342333423
             if info.by_ref {
3342433424
                 let caller_slot =
3342533425
                     b.load_typed(info.addr, IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))));
33426
-                b.load_typed(caller_slot, IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))))
33426
+                b.load_typed(
33427
+                    caller_slot,
33428
+                    IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))),
33429
+                )
3342733430
             } else {
3342833431
                 let load_ty = if info.ty.is_ptr() {
3342933432
                     info.ty.clone()
@@ -33519,8 +33522,7 @@ fn lower_arg_descriptor(
3351933522
         if let Expr::Name { name } = &expr.node {
3352033523
             let key = name.to_lowercase();
3352133524
             if let Some(info) = locals.get(&key) {
33522
-                if expr_needs_static_scalar_descriptor_view(expr, info, locals, st, type_layouts)
33523
-                {
33525
+                if expr_needs_static_scalar_descriptor_view(expr, info, locals, st, type_layouts) {
3352433526
                     return lower_descriptor_actual_from_info(b, info, type_layouts, true);
3352533527
                 }
3352633528
             }
@@ -33590,13 +33592,7 @@ fn lower_arg_descriptor(
3359033592
     // error message arg lists like `linalg_state_type`'s a1..a20)
3359133593
     // tolerates unknown-type fallthrough gracefully.
3359233594
     if force_static_scalar_polymorphic_view {
33593
-        return box_actual_into_class_star_descriptor(
33594
-            b,
33595
-            locals,
33596
-            expr,
33597
-            st,
33598
-            type_layouts,
33599
-        );
33595
+        return box_actual_into_class_star_descriptor(b, locals, expr, st, type_layouts);
3360033596
     }
3360133597
     b.const_i64(0)
3360233598
 }
@@ -33625,8 +33621,7 @@ fn box_actual_into_class_star_descriptor(
3362533621
     // to put in the descriptor's base_addr. For scalars we lower the
3362633622
     // expression and store into a temp; for whole-array names we use
3362733623
     // their existing storage.
33628
-    let (base_ptr, elem_size_bytes): (ValueId, i64) = if let Expr::Name { name } = &expr.node
33629
-    {
33624
+    let (base_ptr, elem_size_bytes): (ValueId, i64) = if let Expr::Name { name } = &expr.node {
3363033625
         if let Some(info) = locals.get(&name.to_lowercase()) {
3363133626
             let bytes = ir_scalar_byte_size(&info.ty).max(1);
3363233627
             let addr = if info.by_ref {
@@ -34155,15 +34150,20 @@ fn expr_contains_whole_array_intrinsic(expr: &crate::ast::expr::SpannedExpr) ->
3415534150
                     expr_contains_whole_array_intrinsic(e)
3415634151
                 }
3415734152
                 crate::ast::expr::SectionSubscript::Range { start, end, stride } => {
34158
-                    start.as_ref().is_some_and(expr_contains_whole_array_intrinsic)
34159
-                        || end.as_ref().is_some_and(expr_contains_whole_array_intrinsic)
34160
-                        || stride.as_ref().is_some_and(expr_contains_whole_array_intrinsic)
34153
+                    start
34154
+                        .as_ref()
34155
+                        .is_some_and(expr_contains_whole_array_intrinsic)
34156
+                        || end
34157
+                            .as_ref()
34158
+                            .is_some_and(expr_contains_whole_array_intrinsic)
34159
+                        || stride
34160
+                            .as_ref()
34161
+                            .is_some_and(expr_contains_whole_array_intrinsic)
3416134162
                 }
3416234163
             })
3416334164
         }
3416434165
         Expr::BinaryOp { left, right, .. } => {
34165
-            expr_contains_whole_array_intrinsic(left)
34166
-                || expr_contains_whole_array_intrinsic(right)
34166
+            expr_contains_whole_array_intrinsic(left) || expr_contains_whole_array_intrinsic(right)
3416734167
         }
3416834168
         Expr::UnaryOp { operand, .. } => expr_contains_whole_array_intrinsic(operand),
3416934169
         Expr::ParenExpr { inner } => expr_contains_whole_array_intrinsic(inner),
@@ -34337,16 +34337,12 @@ fn materialize_scalarized_rank1_constructors(
3433734337
             let (desc, elem_ty) =
3433834338
                 lower_array_expr_descriptor(b, locals, expr, st, type_layouts, None, None, None)?;
3433934339
             let first = first_array_constructor_expr(values)?;
34340
-            let derived_type = match first_array_constructor_type_info(
34341
-                values,
34342
-                Some(locals),
34343
-                st,
34344
-                type_layouts,
34345
-            ) {
34346
-                Some(crate::sema::symtab::TypeInfo::Derived(name))
34347
-                | Some(crate::sema::symtab::TypeInfo::Class(name)) => Some(name),
34348
-                _ => None,
34349
-            };
34340
+            let derived_type =
34341
+                match first_array_constructor_type_info(values, Some(locals), st, type_layouts) {
34342
+                    Some(crate::sema::symtab::TypeInfo::Derived(name))
34343
+                    | Some(crate::sema::symtab::TypeInfo::Class(name)) => Some(name),
34344
+                    _ => None,
34345
+                };
3435034346
             let (local_ty, char_kind) =
3435134347
                 if expr_is_character_expr(b, locals, first, st, type_layouts) {
3435234348
                     let elem_len =
@@ -34374,7 +34370,7 @@ fn materialize_scalarized_rank1_constructors(
3437434370
                     is_pointer: false,
3437534371
                     runtime_dim_upper: vec![],
3437634372
                     is_class: false,
34377
-            logical_kind: None,
34373
+                    logical_kind: None,
3437834374
                     last_dim_assumed_size: false,
3437934375
                 },
3438034376
             );
@@ -35090,8 +35086,7 @@ fn lower_reshape_array_expr_descriptor(
3509035086
                     vec![desc, zero32, sz384],
3509135087
                     IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))),
3509235088
                 );
35093
-                let base_ptr =
35094
-                    b.load_typed(source_desc, IrType::Ptr(Box::new(elem_ty.clone())));
35089
+                let base_ptr = b.load_typed(source_desc, IrType::Ptr(Box::new(elem_ty.clone())));
3509535090
                 store_byte_aggregate_field(
3509635091
                     b,
3509735092
                     desc,
@@ -35110,9 +35105,27 @@ fn lower_reshape_array_expr_descriptor(
3511035105
                     let lower = b.const_i64(1);
3511135106
                     let upper = b.const_i64(extent);
3511235107
                     let stride = b.const_i64(1);
35113
-                    store_byte_aggregate_field(b, desc, base_offset, IrType::Int(IntWidth::I64), lower);
35114
-                    store_byte_aggregate_field(b, desc, base_offset + 8, IrType::Int(IntWidth::I64), upper);
35115
-                    store_byte_aggregate_field(b, desc, base_offset + 16, IrType::Int(IntWidth::I64), stride);
35108
+                    store_byte_aggregate_field(
35109
+                        b,
35110
+                        desc,
35111
+                        base_offset,
35112
+                        IrType::Int(IntWidth::I64),
35113
+                        lower,
35114
+                    );
35115
+                    store_byte_aggregate_field(
35116
+                        b,
35117
+                        desc,
35118
+                        base_offset + 8,
35119
+                        IrType::Int(IntWidth::I64),
35120
+                        upper,
35121
+                    );
35122
+                    store_byte_aggregate_field(
35123
+                        b,
35124
+                        desc,
35125
+                        base_offset + 16,
35126
+                        IrType::Int(IntWidth::I64),
35127
+                        stride,
35128
+                    );
3511635129
                 }
3511735130
                 return Some((desc, elem_ty));
3511835131
             }
@@ -35249,10 +35262,8 @@ fn lower_transfer_array_expr_descriptor(
3524935262
     // operate on it.  ArrayConstructors are array-valued by definition;
3525035263
     // expr_returns_array's conservative classifier doesn't cover them
3525135264
     // so we add an explicit check here.
35252
-    let mold_is_array_constructor =
35253
-        matches!(mold_expr.node, Expr::ArrayConstructor { .. });
35254
-    let mold_is_array =
35255
-        mold_is_array_constructor || expr_returns_array(mold_expr, locals, st);
35265
+    let mold_is_array_constructor = matches!(mold_expr.node, Expr::ArrayConstructor { .. });
35266
+    let mold_is_array = mold_is_array_constructor || expr_returns_array(mold_expr, locals, st);
3525635267
     if !mold_is_array && size_expr_opt.is_none() {
3525735268
         return None;
3525835269
     }
@@ -35281,9 +35292,7 @@ fn lower_transfer_array_expr_descriptor(
3528135292
     //     bytes are constant from the constructor length × elem size.
3528235293
     let tl = type_layouts?;
3528335294
     let (src_base, src_total_bytes_v, src_total_bytes_const): (ValueId, ValueId, Option<i64>) =
35284
-        if let Some(src_info) =
35285
-            whole_array_expr_local_info(b, locals, src_expr, st, tl)
35286
-        {
35295
+        if let Some(src_info) = whole_array_expr_local_info(b, locals, src_expr, st, tl) {
3528735296
             let elem_bytes = descriptor_element_size_bytes(&src_info);
3528835297
             if elem_bytes <= 0 {
3528935298
                 return None;
@@ -35310,8 +35319,7 @@ fn lower_transfer_array_expr_descriptor(
3531035319
                 contained_host_refs,
3531135320
                 descriptor_params,
3531235321
             )?;
35313
-            let base =
35314
-                b.load_typed(src_desc, IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))));
35322
+            let base = b.load_typed(src_desc, IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))));
3531535323
             // Constructor length × first-value elem size for compile-time total.
3531635324
             let Expr::ArrayConstructor { values, .. } = &src_expr.node else {
3531735325
                 unreachable!()
@@ -36068,7 +36076,7 @@ fn try_lower_elemental_subroutine_call(
3606836076
                     is_pointer: false,
3606936077
                     runtime_dim_upper: vec![],
3607036078
                     is_class: false,
36071
-            logical_kind: None,
36079
+                    logical_kind: None,
3607236080
                     last_dim_assumed_size: false,
3607336081
                 },
3607436082
             );
@@ -36332,10 +36340,8 @@ fn lower_rank1_elemental_call_descriptor(
3633236340
                 Some(crate::sema::symtab::TypeInfo::Class(name)) => Some(name.clone()),
3633336341
                 _ => None,
3633436342
             };
36335
-            let is_class_actual = matches!(
36336
-                actual_type,
36337
-                Some(crate::sema::symtab::TypeInfo::Class(_))
36338
-            );
36343
+            let is_class_actual =
36344
+                matches!(actual_type, Some(crate::sema::symtab::TypeInfo::Class(_)));
3633936345
             loop_locals.insert(
3634036346
                 temp_name.clone(),
3634136347
                 LocalInfo {
@@ -36443,8 +36449,7 @@ fn lower_rank1_elemental_call_descriptor(
3644336449
             // i-th array element into the per-iteration temp slot.
3644436450
             // Loading and re-storing as a value would emit a `[i8 x N]`
3644536451
             // load that codegen can't materialize cleanly.
36446
-            let src_ptr =
36447
-                rank1_array_desc_elem_ptr(b, *actual_desc, actual_elem_ty, cur_idx);
36452
+            let src_ptr = rank1_array_desc_elem_ptr(b, *actual_desc, actual_elem_ty, cur_idx);
3644836453
             let elem_bytes = b.const_i64(ir_scalar_byte_size(actual_elem_ty));
3644936454
             b.call(
3645036455
                 FuncRef::External("memcpy".into()),
@@ -36465,7 +36470,7 @@ fn lower_rank1_elemental_call_descriptor(
3646536470
                 is_pointer: false,
3646636471
                 runtime_dim_upper: vec![],
3646736472
                 is_class: false,
36468
-            logical_kind: None,
36473
+                logical_kind: None,
3646936474
                 last_dim_assumed_size: false,
3647036475
             };
3647136476
             let (src_ptr, src_len) =
@@ -36858,8 +36863,14 @@ fn lower_rank1_array_compare_descriptor(
3685836863
         coerce_to_type(b, raw, operand_ty)
3685936864
     } else {
3686036865
         let scalar = lower_expr_full(
36861
-            b, locals, left, st, type_layouts,
36862
-            internal_funcs, contained_host_refs, descriptor_params,
36866
+            b,
36867
+            locals,
36868
+            left,
36869
+            st,
36870
+            type_layouts,
36871
+            internal_funcs,
36872
+            contained_host_refs,
36873
+            descriptor_params,
3686336874
         );
3686436875
         coerce_to_type(b, scalar, operand_ty)
3686536876
     };
@@ -36868,8 +36879,14 @@ fn lower_rank1_array_compare_descriptor(
3686836879
         coerce_to_type(b, raw, operand_ty)
3686936880
     } else {
3687036881
         let scalar = lower_expr_full(
36871
-            b, locals, right, st, type_layouts,
36872
-            internal_funcs, contained_host_refs, descriptor_params,
36882
+            b,
36883
+            locals,
36884
+            right,
36885
+            st,
36886
+            type_layouts,
36887
+            internal_funcs,
36888
+            contained_host_refs,
36889
+            descriptor_params,
3687336890
         );
3687436891
         coerce_to_type(b, scalar, operand_ty)
3687536892
     };
@@ -36948,7 +36965,8 @@ fn lower_rank1_numeric_array_binary_descriptor(
3694836965
         .as_ref()
3694936966
         .map(|(_, ty)| ty.clone())
3695036967
         .or_else(|| rhs.as_ref().map(|(_, ty)| ty.clone()))?;
36951
-    let is_complex_elem = matches!(&elem_ty, IrType::Array(inner, 2) if matches!(inner.as_ref(), IrType::Float(_)));
36968
+    let is_complex_elem =
36969
+        matches!(&elem_ty, IrType::Array(inner, 2) if matches!(inner.as_ref(), IrType::Float(_)));
3695236970
     match &elem_ty {
3695336971
         IrType::Int(_) | IrType::Float(_) | IrType::Bool => {}
3695436972
         _ if is_complex_elem => {}
@@ -36967,12 +36985,7 @@ fn lower_rank1_numeric_array_binary_descriptor(
3696736985
     // Integer or Real semantic types.
3696836986
     let is_compare_op = matches!(
3696936987
         op,
36970
-        BinaryOp::Eq
36971
-            | BinaryOp::Ne
36972
-            | BinaryOp::Lt
36973
-            | BinaryOp::Le
36974
-            | BinaryOp::Gt
36975
-            | BinaryOp::Ge
36988
+        BinaryOp::Eq | BinaryOp::Ne | BinaryOp::Lt | BinaryOp::Le | BinaryOp::Gt | BinaryOp::Ge
3697636989
     );
3697736990
     if is_compare_op && !is_complex_elem {
3697836991
         use crate::sema::types::FortranType;
@@ -36986,9 +36999,7 @@ fn lower_rank1_numeric_array_binary_descriptor(
3698636999
         let is_numeric = |t: &FortranType| {
3698737000
             matches!(
3698837001
                 t,
36989
-                FortranType::Integer { .. }
36990
-                    | FortranType::Real { .. }
36991
-                    | FortranType::Unknown
37002
+                FortranType::Integer { .. } | FortranType::Real { .. } | FortranType::Unknown
3699237003
             )
3699337004
         };
3699437005
         if is_numeric(&lt) && is_numeric(&rt) {
@@ -37084,7 +37095,10 @@ fn lower_rank1_numeric_array_binary_descriptor(
3708437095
         let lane_bytes = b.const_i64(if fw == FloatWidth::F64 { 8 } else { 4 });
3708537096
         let zero = b.const_i64(0);
3708637097
 
37087
-        let load_lanes = |b: &mut FuncBuilder, side: Option<&(ValueId, IrType)>, side_expr: &crate::ast::expr::SpannedExpr| -> (ValueId, ValueId) {
37098
+        let load_lanes = |b: &mut FuncBuilder,
37099
+                          side: Option<&(ValueId, IrType)>,
37100
+                          side_expr: &crate::ast::expr::SpannedExpr|
37101
+         -> (ValueId, ValueId) {
3708837102
             if let Some((desc, _)) = side {
3708937103
                 let elem_ptr = rank1_array_desc_elem_ptr(b, *desc, &elem_ty, idx);
3709037104
                 let re_ptr = b.gep(elem_ptr, vec![zero], IrType::Int(IntWidth::I8));
@@ -37497,10 +37511,7 @@ fn lower_array_expr_descriptor(
3749737511
                 // result as ArrayDescriptor — intrinsics aren't there,
3749837512
                 // so the rhs would silently scalarize and emit `isub`
3749937513
                 // against the descriptor pointer.
37500
-                if matches!(
37501
-                    name.to_ascii_lowercase().as_str(),
37502
-                    "matmul" | "transpose"
37503
-                ) {
37514
+                if matches!(name.to_ascii_lowercase().as_str(), "matmul" | "transpose") {
3750437515
                     if let Some(first_arg) = args.first() {
3750537516
                         if let crate::ast::expr::SectionSubscript::Element(first_expr) =
3750637517
                             &first_arg.value
@@ -37605,16 +37616,15 @@ fn lower_array_expr_descriptor(
3760537616
                                 contained_host_refs,
3760637617
                                 descriptor_params,
3760737618
                             ) {
37608
-                                let real_lane =
37609
-                                    if let IrType::Array(inner, 2) = &elem_ty {
37610
-                                        if let IrType::Float(fw) = inner.as_ref() {
37611
-                                            Some(*fw)
37612
-                                        } else {
37613
-                                            None
37614
-                                        }
37619
+                                let real_lane = if let IrType::Array(inner, 2) = &elem_ty {
37620
+                                    if let IrType::Float(fw) = inner.as_ref() {
37621
+                                        Some(*fw)
3761537622
                                     } else {
3761637623
                                         None
37617
-                                    };
37624
+                                    }
37625
+                                } else {
37626
+                                    None
37627
+                                };
3761837628
                                 if let Some(fw) = real_lane {
3761937629
                                     let result_desc = b.alloca(IrType::Array(
3762037630
                                         Box::new(IrType::Int(IntWidth::I8)),
@@ -37690,7 +37700,8 @@ fn lower_array_expr_descriptor(
3769037700
                                         continue;
3769137701
                                     };
3769237702
                                     match a.keyword.as_deref().map(str::to_ascii_lowercase) {
37693
-                                        Some(ref kw) if kw == "x" => { /* re — already handled */ }
37703
+                                        Some(ref kw) if kw == "x" => { /* re — already handled */
37704
+                                        }
3769437705
                                         Some(ref kw) if kw == "y" => im_expr = Some(e),
3769537706
                                         Some(ref kw) if kw == "kind" => kind_expr = Some(e),
3769637707
                                         Some(_) => {}
@@ -37763,8 +37774,7 @@ fn lower_array_expr_descriptor(
3776337774
                                 } else {
3776437775
                                     FloatWidth::F32
3776537776
                                 };
37766
-                                let elem_ty =
37767
-                                    IrType::Array(Box::new(IrType::Float(out_fw)), 2);
37777
+                                let elem_ty = IrType::Array(Box::new(IrType::Float(out_fw)), 2);
3776837778
                                 return Some((result_desc, elem_ty));
3776937779
                             }
3777037780
                         }
@@ -37792,13 +37802,11 @@ fn lower_array_expr_descriptor(
3779237802
                             )
3779337803
                             .is_some()
3779437804
                                 || locals
37795
-                                    .get(
37796
-                                        &if let Expr::Name { name } = &first_expr.node {
37797
-                                            name.to_lowercase()
37798
-                                        } else {
37799
-                                            String::new()
37800
-                                        },
37801
-                                    )
37805
+                                    .get(&if let Expr::Name { name } = &first_expr.node {
37806
+                                        name.to_lowercase()
37807
+                                    } else {
37808
+                                        String::new()
37809
+                                    })
3780237810
                                     .map(local_is_array_like)
3780337811
                                     .unwrap_or(false)
3780437812
                             {
@@ -37930,9 +37938,9 @@ fn lower_array_expr_descriptor(
3793037938
         Expr::ArrayConstructor { values, type_spec } => {
3793137939
             let first = first_array_constructor_expr(values)?;
3793237940
             let spec_ti = array_constructor_type_spec_info(type_spec.as_deref(), st);
37933
-            let first_ti = spec_ti
37934
-                .clone()
37935
-                .or_else(|| first_array_constructor_type_info(values, Some(locals), st, type_layouts));
37941
+            let first_ti = spec_ti.clone().or_else(|| {
37942
+                first_array_constructor_type_info(values, Some(locals), st, type_layouts)
37943
+            });
3793637944
 
3793737945
             if expr_is_character_expr(b, locals, first, st, type_layouts) {
3793837946
                 if let Some(elem_len_const) =
@@ -38145,10 +38153,7 @@ fn expr_returns_array(
3814538153
                 if let Some(info) = locals.get(&key) {
3814638154
                     if local_is_array_like(info)
3814738155
                         && args.iter().any(|a| {
38148
-                            matches!(
38149
-                                a.value,
38150
-                                crate::ast::expr::SectionSubscript::Range { .. }
38151
-                            )
38156
+                            matches!(a.value, crate::ast::expr::SectionSubscript::Range { .. })
3815238157
                         })
3815338158
                     {
3815438159
                         return true;
@@ -38427,9 +38432,9 @@ fn lower_1d_section_assign(
3842738432
     dest_args: &[crate::ast::expr::Argument],
3842838433
     value: &crate::ast::expr::SpannedExpr,
3842938434
 ) -> bool {
38430
-    let any_range = dest_args.iter().any(|a| {
38431
-        matches!(a.value, crate::ast::expr::SectionSubscript::Range { .. })
38432
-    });
38435
+    let any_range = dest_args
38436
+        .iter()
38437
+        .any(|a| matches!(a.value, crate::ast::expr::SectionSubscript::Range { .. }));
3843338438
     if !any_range {
3843438439
         return false;
3843538440
     }
@@ -38478,7 +38483,7 @@ fn lower_1d_section_assign(
3847838483
                         is_pointer: false,
3847938484
                         runtime_dim_upper: vec![],
3848038485
                         is_class: false,
38481
-            logical_kind: None,
38486
+                        logical_kind: None,
3848238487
                         last_dim_assumed_size: false,
3848338488
                     },
3848438489
                 );
@@ -38836,7 +38841,7 @@ fn lower_forall_nested(
3883638841
                         is_pointer: false,
3883738842
                         runtime_dim_upper: vec![],
3883838843
                         is_class: false,
38839
-            logical_kind: None,
38844
+                        logical_kind: None,
3884038845
                         last_dim_assumed_size: false,
3884138846
                     },
3884238847
                 );
@@ -39105,10 +39110,8 @@ fn lower_array_assign(
3910539110
                         vec![dest_desc, src_desc, null_stat],
3910639111
                         IrType::Void,
3910739112
                     );
39108
-                    let dest_base = b.load_typed(
39109
-                        dest_desc,
39110
-                        IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))),
39111
-                    );
39113
+                    let dest_base =
39114
+                        b.load_typed(dest_desc, IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))));
3911239115
                     let dest_n = b.call(
3911339116
                         FuncRef::External("afs_array_size".into()),
3911439117
                         vec![dest_desc],
@@ -39143,7 +39146,8 @@ fn lower_array_assign(
3914339146
     // constructor's literal values into the destination.
3914439147
     if let Expr::ArrayConstructor { values, .. } = &value.node {
3914539148
         if let Some(type_name) = dest_info.derived_type.as_deref() {
39146
-            if local_uses_array_descriptor(dest_info) && (dest_info.allocatable || dest_symbol_allocatable)
39149
+            if local_uses_array_descriptor(dest_info)
39150
+                && (dest_info.allocatable || dest_symbol_allocatable)
3914739151
             {
3914839152
                 if let Some((src_desc, _)) = lower_array_expr_descriptor(
3914939153
                     b,
@@ -39393,8 +39397,14 @@ fn lower_array_assign(
3939339397
             && !dest_info.allocatable
3939439398
         {
3939539399
             if let Some((src_desc, src_elem_ty)) = lower_array_expr_descriptor(
39396
-                b, &ctx.locals, value, ctx.st, Some(ctx.type_layouts),
39397
-                Some(ctx.internal_funcs), Some(ctx.contained_host_refs), Some(ctx.descriptor_params),
39400
+                b,
39401
+                &ctx.locals,
39402
+                value,
39403
+                ctx.st,
39404
+                Some(ctx.type_layouts),
39405
+                Some(ctx.internal_funcs),
39406
+                Some(ctx.contained_host_refs),
39407
+                Some(ctx.descriptor_params),
3939839408
             ) {
3939939409
                 let dest_base = array_base_addr(b, dest_info);
3940039410
                 let n = array_total_elems_value(b, dest_info);
@@ -39567,12 +39577,9 @@ fn rewrite_scalarized_section_refs(
3956739577
     }
3956839578
 }
3956939579
 
39570
-fn rewrite_scalarized_section_refs_stmt(
39571
-    stmt: &SpannedStmt,
39572
-    scalarized: &[String],
39573
-) -> SpannedStmt {
39574
-    use crate::ast::Spanned;
39580
+fn rewrite_scalarized_section_refs_stmt(stmt: &SpannedStmt, scalarized: &[String]) -> SpannedStmt {
3957539581
     use crate::ast::stmt::Stmt;
39582
+    use crate::ast::Spanned;
3957639583
     match &stmt.node {
3957739584
         Stmt::Assignment { target, value } => Spanned::new(
3957839585
             Stmt::Assignment {
@@ -39755,7 +39762,9 @@ fn first_arg_is_complex(
3975539762
         .and_then(|a| {
3975639763
             if let crate::ast::expr::SectionSubscript::Element(e) = &a.value {
3975739764
                 if let Expr::Name { name } = &e.node {
39758
-                    locals.get(&name.to_lowercase()).map(|i| is_complex_ty(&i.ty))
39765
+                    locals
39766
+                        .get(&name.to_lowercase())
39767
+                        .map(|i| is_complex_ty(&i.ty))
3975939768
                 } else {
3976039769
                     None
3976139770
                 }
@@ -40083,7 +40092,7 @@ fn component_intrinsic_local_info(
4008340092
         is_pointer: field.pointer,
4008440093
         runtime_dim_upper: vec![],
4008540094
         is_class: false,
40086
-            logical_kind: None,
40095
+        logical_kind: None,
4008740096
         last_dim_assumed_size: false,
4008840097
     })
4008940098
 }
@@ -40109,7 +40118,7 @@ fn component_field_local_info(
4010940118
         is_pointer: field.pointer,
4011040119
         runtime_dim_upper: vec![],
4011140120
         is_class: false,
40112
-            logical_kind: None,
40121
+        logical_kind: None,
4011340122
         last_dim_assumed_size: false,
4011440123
     })
4011540124
 }
@@ -40125,9 +40134,9 @@ fn associate_alias_local_info(
4012540134
             component_field_local_info(b, &ctx.locals, expr, ctx.st, ctx.type_layouts)
4012640135
         }
4012740136
         Expr::FunctionCall { callee, args } => {
40128
-            let any_range = args.iter().any(|arg| {
40129
-                matches!(arg.value, crate::ast::expr::SectionSubscript::Range { .. })
40130
-            });
40137
+            let any_range = args
40138
+                .iter()
40139
+                .any(|arg| matches!(arg.value, crate::ast::expr::SectionSubscript::Range { .. }));
4013140140
             if any_range {
4013240141
                 // Array section: bind associate-name to a section descriptor so
4013340142
                 // the alias behaves as a rank-N array view of the source storage.
@@ -40172,7 +40181,7 @@ fn associate_alias_local_info(
4017240181
                     is_pointer: false,
4017340182
                     runtime_dim_upper: vec![],
4017440183
                     is_class: false,
40175
-            logical_kind: None,
40184
+                    logical_kind: None,
4017640185
                     last_dim_assumed_size: false,
4017740186
                 });
4017840187
             }
@@ -40203,7 +40212,7 @@ fn associate_alias_local_info(
4020340212
                     is_pointer: false,
4020440213
                     runtime_dim_upper: vec![],
4020540214
                     is_class: false,
40206
-            logical_kind: None,
40215
+                    logical_kind: None,
4020740216
                     last_dim_assumed_size: false,
4020840217
                 });
4020940218
             }
@@ -40231,7 +40240,7 @@ fn associate_alias_local_info(
4023140240
                     is_pointer: false,
4023240241
                     runtime_dim_upper: vec![],
4023340242
                     is_class: false,
40234
-            logical_kind: None,
40243
+                    logical_kind: None,
4023540244
                     last_dim_assumed_size: false,
4023640245
                 });
4023740246
             }
@@ -40354,25 +40363,27 @@ fn lower_array_intrinsic(
4035440363
             // pick the size_dim runtime entry — a `kind=` keyword arg
4035540364
             // alone (e.g. `size(a, kind=ilp)`) means total size, not
4035640365
             // size-along-dim. Treat positional second arg as dim.
40357
-            let dim_arg_expr = args.iter().enumerate().find_map(|(i, a)| match a.keyword.as_deref()
40358
-            {
40359
-                Some(k) if k.eq_ignore_ascii_case("dim") => {
40360
-                    if let crate::ast::expr::SectionSubscript::Element(e) = &a.value {
40361
-                        Some(e)
40362
-                    } else {
40363
-                        None
40364
-                    }
40365
-                }
40366
-                Some(_) => None, // kind= or other — not a dim arg
40367
-                None if i == 1 => {
40368
-                    if let crate::ast::expr::SectionSubscript::Element(e) = &a.value {
40369
-                        Some(e)
40370
-                    } else {
40371
-                        None
40372
-                    }
40373
-                }
40374
-                None => None,
40375
-            });
40366
+            let dim_arg_expr =
40367
+                args.iter()
40368
+                    .enumerate()
40369
+                    .find_map(|(i, a)| match a.keyword.as_deref() {
40370
+                        Some(k) if k.eq_ignore_ascii_case("dim") => {
40371
+                            if let crate::ast::expr::SectionSubscript::Element(e) = &a.value {
40372
+                                Some(e)
40373
+                            } else {
40374
+                                None
40375
+                            }
40376
+                        }
40377
+                        Some(_) => None, // kind= or other — not a dim arg
40378
+                        None if i == 1 => {
40379
+                            if let crate::ast::expr::SectionSubscript::Element(e) = &a.value {
40380
+                                Some(e)
40381
+                            } else {
40382
+                                None
40383
+                            }
40384
+                        }
40385
+                        None => None,
40386
+                    });
4037640387
             if let Some(e) = dim_arg_expr {
4037740388
                 // SIZE(array, dim)
4037840389
                 {
@@ -41356,13 +41367,7 @@ fn clear_derived_storage_for_intent_out(
4135641367
         for idx in 0..elem_count {
4135741368
             let byte_off = b.const_i64(idx * elem_bytes);
4135841369
             let elem_ptr = b.gep(field_ptr, vec![byte_off], IrType::Int(IntWidth::I8));
41359
-            clear_derived_storage_for_intent_out(
41360
-                b,
41361
-                elem_ptr,
41362
-                nested_layout,
41363
-                registry,
41364
-                stat_addr,
41365
-            );
41370
+            clear_derived_storage_for_intent_out(b, elem_ptr, nested_layout, registry, stat_addr);
4136641371
         }
4136741372
     }
4136841373
 
@@ -41583,7 +41588,9 @@ fn resolve_component_base(
4158341588
             // Pointer dummies passed by reference add one more layer:
4158441589
             // info.addr points at the caller's pointer slot, whose
4158541590
             // contents then point at the associated struct.
41586
-            let addr = if info.is_pointer && local_uses_array_descriptor(info) && info.dims.is_empty()
41591
+            let addr = if info.is_pointer
41592
+                && local_uses_array_descriptor(info)
41593
+                && info.dims.is_empty()
4158741594
             {
4158841595
                 array_base_addr(b, info)
4158941596
             } else if info.is_pointer {
@@ -41805,7 +41812,7 @@ fn component_array_local_info(
4180541812
         is_pointer: field.pointer,
4180641813
         runtime_dim_upper: vec![],
4180741814
         is_class: false,
41808
-            logical_kind: None,
41815
+        logical_kind: None,
4180941816
         last_dim_assumed_size: false,
4181041817
     })
4181141818
 }
@@ -42059,7 +42066,7 @@ fn expr_is_character_expr(
4205942066
                                     is_pointer: field.pointer,
4206042067
                                     runtime_dim_upper: vec![],
4206142068
                                     is_class: false,
42062
-            logical_kind: None,
42069
+                                    logical_kind: None,
4206342070
                                     last_dim_assumed_size: false,
4206442071
                                 },
4206542072
                             )
@@ -42131,7 +42138,11 @@ fn allocate_hidden_result_buffer(
4213142138
         IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))),
4213242139
     );
4213342140
     let typed = if abi == HiddenResultAbi::ComplexBuffer {
42134
-        let fw = if bytes == 16 { FloatWidth::F64 } else { FloatWidth::F32 };
42141
+        let fw = if bytes == 16 {
42142
+            FloatWidth::F64
42143
+        } else {
42144
+            FloatWidth::F32
42145
+        };
4213542146
         let cplx_ty = IrType::Array(Box::new(IrType::Float(fw)), 2);
4213642147
         let zero = b.const_i64(0);
4213742148
         b.gep(raw, vec![zero], cplx_ty)
@@ -42152,8 +42163,9 @@ fn hidden_result_temp_bytes_for_callee(
4215242163
         HiddenResultAbi::ArrayDescriptor => Some(384),
4215342164
         HiddenResultAbi::StringDescriptor => Some(32),
4215442165
         HiddenResultAbi::DerivedAggregate => {
42155
-            let type_name =
42156
-                first_procedure_lookup(abi_lookup_keys, |k| callee_return_derived_type_name(st, k))?;
42166
+            let type_name = first_procedure_lookup(abi_lookup_keys, |k| {
42167
+                callee_return_derived_type_name(st, k)
42168
+            })?;
4215742169
             let layout = type_layouts?.get(&type_name)?;
4215842170
             Some(layout.size.max(1) as u64)
4215942171
         }
@@ -42163,13 +42175,16 @@ fn hidden_result_temp_bytes_for_callee(
4216342175
             // symbol can't be resolved — same fallback DerivedAggregate
4216442176
             // uses for missing layouts.
4216542177
             use crate::sema::symtab::TypeInfo;
42166
-            let kind_bytes = abi_lookup_keys.iter().find_map(|k| {
42167
-                let sym = st.find_symbol_any_scope(&k.to_lowercase())?;
42168
-                match sym.type_info.as_ref()? {
42169
-                    TypeInfo::Complex { kind } => Some(kind.unwrap_or(4) as u64 * 2),
42170
-                    _ => None,
42171
-                }
42172
-            }).unwrap_or(8);
42178
+            let kind_bytes = abi_lookup_keys
42179
+                .iter()
42180
+                .find_map(|k| {
42181
+                    let sym = st.find_symbol_any_scope(&k.to_lowercase())?;
42182
+                    match sym.type_info.as_ref()? {
42183
+                        TypeInfo::Complex { kind } => Some(kind.unwrap_or(4) as u64 * 2),
42184
+                        _ => None,
42185
+                    }
42186
+                })
42187
+                .unwrap_or(8);
4217342188
             Some(kind_bytes)
4217442189
         }
4217542190
     }
@@ -42739,7 +42754,7 @@ fn ensure_hidden_string_result_local(
4273942754
                 is_pointer: false,
4274042755
                 runtime_dim_upper: vec![],
4274142756
                 is_class: false,
42742
-            logical_kind: None,
42757
+                logical_kind: None,
4274342758
                 last_dim_assumed_size: false,
4274442759
             },
4274542760
         );
@@ -42777,7 +42792,7 @@ fn ensure_hidden_string_result_local(
4277742792
                 is_pointer: false,
4277842793
                 runtime_dim_upper: vec![],
4277942794
                 is_class: false,
42780
-            logical_kind: None,
42795
+                logical_kind: None,
4278142796
                 last_dim_assumed_size: false,
4278242797
             },
4278342798
         );
@@ -42829,7 +42844,7 @@ fn ensure_hidden_string_result_local(
4282942844
                 is_pointer: false,
4283042845
                 runtime_dim_upper: vec![],
4283142846
                 is_class: false,
42832
-            logical_kind: None,
42847
+                logical_kind: None,
4283342848
                 last_dim_assumed_size: false,
4283442849
             },
4283542850
         );
@@ -42936,8 +42951,7 @@ fn allocate_status_target_addr(b: &mut FuncBuilder, ctx: &LowerCtx, opts: &[IoCo
4293642951
                     "ALLOCATE/DEALLOCATE STAT= must name a scalar integer variable",
4293742952
                 );
4293842953
             };
42939
-            let is_scalar_int = info.dims.is_empty()
42940
-                && matches!(info.ty, IrType::Int(_));
42954
+            let is_scalar_int = info.dims.is_empty() && matches!(info.ty, IrType::Int(_));
4294142955
             if !is_scalar_int {
4294242956
                 lower_stmt_error(
4294342957
                     stat_expr.span,
@@ -43167,7 +43181,10 @@ fn emit_derived_array_desc_copy(
4316743181
     let dest_stride = load_array_desc_i64_field(b, dest_desc, 24 + 16);
4316843182
     let src_stride = load_array_desc_i64_field(b, source_desc, 24 + 16);
4316943183
     let dest_base = b.load_typed(dest_desc, IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))));
43170
-    let src_base = b.load_typed(source_desc, IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))));
43184
+    let src_base = b.load_typed(
43185
+        source_desc,
43186
+        IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))),
43187
+    );
4317143188
 
4317243189
     if derived_layout_needs_runtime_initialization(layout, type_layouts) {
4317343190
         initialize_derived_array_storage_dynamic(b, dest_base, layout, dest_n, type_layouts);
@@ -43260,8 +43277,10 @@ fn emit_allocatable_source_copy_on_success(
4326043277
             Some(ScalarAllocSourceCopyPlan::Static(type_name)) => {
4326143278
                 let dest_base =
4326243279
                     b.load_typed(dest_desc, IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))));
43263
-                let source_base =
43264
-                    b.load_typed(source_desc, IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))));
43280
+                let source_base = b.load_typed(
43281
+                    source_desc,
43282
+                    IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))),
43283
+                );
4326543284
                 emit_derived_value_copy(b, type_layouts, type_name, dest_base, source_base);
4326643285
                 true
4326743286
             }
@@ -43289,10 +43308,8 @@ fn emit_allocatable_source_copy_on_success(
4328943308
                         .map(|(i, _)| b.create_block(&format!("alloc_source_dispatch_case_{}", i)))
4329043309
                         .collect();
4329143310
                     b.branch(test_blocks[0], vec![]);
43292
-                    for (idx, ((type_tag, type_name), case_bb)) in candidates
43293
-                        .iter()
43294
-                        .zip(case_blocks.iter())
43295
-                        .enumerate()
43311
+                    for (idx, ((type_tag, type_name), case_bb)) in
43312
+                        candidates.iter().zip(case_blocks.iter()).enumerate()
4329643313
                     {
4329743314
                         b.set_block(test_blocks[idx]);
4329843315
                         let want_tag = b.const_i64(*type_tag as i64);
@@ -43305,13 +43322,7 @@ fn emit_allocatable_source_copy_on_success(
4330543322
                         b.cond_branch(is_match, *case_bb, vec![], next_bb, vec![]);
4330643323
 
4330743324
                         b.set_block(*case_bb);
43308
-                        emit_derived_value_copy(
43309
-                            b,
43310
-                            type_layouts,
43311
-                            type_name,
43312
-                            dest_base,
43313
-                            source_base,
43314
-                        );
43325
+                        emit_derived_value_copy(b, type_layouts, type_name, dest_base, source_base);
4331543326
                         b.branch(done_bb, vec![]);
4331643327
                     }
4331743328
                     b.set_block(fallback);
@@ -43339,8 +43350,7 @@ fn static_expr_type_tag_value(
4333943350
     st: &SymbolTable,
4334043351
     type_layouts: &crate::sema::type_layout::TypeLayoutRegistry,
4334143352
 ) -> Option<ValueId> {
43342
-    expr_type_layout(expr, None, st, type_layouts)
43343
-        .map(|layout| b.const_i64(layout.type_tag as i64))
43353
+    expr_type_layout(expr, None, st, type_layouts).map(|layout| b.const_i64(layout.type_tag as i64))
4334443354
 }
4334543355
 
4334643356
 fn derived_type_tag_value(
@@ -43353,9 +43363,7 @@ fn derived_type_tag_value(
4335343363
         .map(|layout| b.const_i64(layout.type_tag as i64))
4335443364
 }
4335543365
 
43356
-fn type_layout_tbp_lookup_symbol(
43357
-    layout: &crate::sema::type_layout::TypeLayout,
43358
-) -> Option<String> {
43366
+fn type_layout_tbp_lookup_symbol(layout: &crate::sema::type_layout::TypeLayout) -> Option<String> {
4335943367
     if layout.bound_procs.is_empty() {
4336043368
         return None;
4336143369
     }
@@ -43420,8 +43428,7 @@ fn static_alloc_target_type_tag_value(
4342043428
     st: &SymbolTable,
4342143429
     type_layouts: &crate::sema::type_layout::TypeLayoutRegistry,
4342243430
 ) -> Option<ValueId> {
43423
-    expr_type_layout(expr, None, st, type_layouts)
43424
-        .map(|layout| b.const_i64(layout.type_tag as i64))
43431
+    expr_type_layout(expr, None, st, type_layouts).map(|layout| b.const_i64(layout.type_tag as i64))
4342543432
 }
4342643433
 
4342743434
 fn static_alloc_target_tbp_lookup_value(
@@ -43639,18 +43646,18 @@ fn resolve_component_base_for_method(
4363943646
             let key = name.to_lowercase();
4364043647
             let info = locals.get(&key)?;
4364143648
             let type_name = info.derived_type.as_ref()?.clone();
43642
-            let addr = if info.is_pointer && local_uses_array_descriptor(info) && info.dims.is_empty()
43643
-            {
43644
-                array_base_addr(b, info)
43645
-            } else if info.is_pointer {
43646
-                b.load_typed(info.addr, IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))))
43647
-            } else if info.allocatable {
43648
-                array_base_addr(b, info)
43649
-            } else if info.by_ref {
43650
-                b.load(info.addr)
43651
-            } else {
43652
-                info.addr
43653
-            };
43649
+            let addr =
43650
+                if info.is_pointer && local_uses_array_descriptor(info) && info.dims.is_empty() {
43651
+                    array_base_addr(b, info)
43652
+                } else if info.is_pointer {
43653
+                    b.load_typed(info.addr, IrType::Ptr(Box::new(IrType::Int(IntWidth::I8))))
43654
+                } else if info.allocatable {
43655
+                    array_base_addr(b, info)
43656
+                } else if info.by_ref {
43657
+                    b.load(info.addr)
43658
+                } else {
43659
+                    info.addr
43660
+                };
4365443661
             Some((addr, type_name))
4365543662
         }
4365643663
         Expr::ComponentAccess {
@@ -44069,7 +44076,7 @@ fn lower_arg_by_ref_full(
4406944076
                         is_pointer: false,
4407044077
                         runtime_dim_upper: vec![],
4407144078
                         is_class: false,
44072
-            logical_kind: None,
44079
+                        logical_kind: None,
4407344080
                         last_dim_assumed_size: false,
4407444081
                     };
4407544082
                     return derived_scalar_storage_addr_for_call(b, &info);
@@ -44589,11 +44596,18 @@ fn substitute_names_in_expr(
4458944596
         match v {
4459044597
             AcValue::Expr(e) => AcValue::Expr(substitute_names_in_expr(e, subst)),
4459144598
             AcValue::ImpliedDo(ido) => AcValue::ImpliedDo(Box::new(ImpliedDoLoop {
44592
-                values: ido.values.iter().map(|v| rewrite_acvalue(v, subst)).collect(),
44599
+                values: ido
44600
+                    .values
44601
+                    .iter()
44602
+                    .map(|v| rewrite_acvalue(v, subst))
44603
+                    .collect(),
4459344604
                 var: ido.var.clone(),
4459444605
                 start: substitute_names_in_expr(&ido.start, subst),
4459544606
                 end: substitute_names_in_expr(&ido.end, subst),
44596
-                step: ido.step.as_ref().map(|e| substitute_names_in_expr(e, subst)),
44607
+                step: ido
44608
+                    .step
44609
+                    .as_ref()
44610
+                    .map(|e| substitute_names_in_expr(e, subst)),
4459744611
             })),
4459844612
         }
4459944613
     }
@@ -44663,7 +44677,9 @@ fn lower_expr_full(
4466344677
             let clean = text.split('_').next().unwrap_or(text);
4466444678
             let kind_width = kind
4466544679
                 .as_deref()
44666
-                .map(|kind_str| int_kind_to_width_in_context(kind_str, Some(locals), None, Some(st)))
44680
+                .map(|kind_str| {
44681
+                    int_kind_to_width_in_context(kind_str, Some(locals), None, Some(st))
44682
+                })
4466744683
                 .unwrap_or_else(crate::driver::defaults::default_int_kind);
4466844684
             let val: i128 = clean.parse().unwrap_or(0);
4466944685
             let width = match kind_width {
@@ -45296,8 +45312,14 @@ fn lower_expr_full(
4529645312
             if let Expr::Name { name } = &callee.node {
4529745313
                 if name.eq_ignore_ascii_case("transfer") && args.len() >= 2 {
4529845314
                     if let Some(result) = lower_transfer_intrinsic(
45299
-                        b, locals, args, st, type_layouts,
45300
-                        internal_funcs, contained_host_refs, descriptor_params,
45315
+                        b,
45316
+                        locals,
45317
+                        args,
45318
+                        st,
45319
+                        type_layouts,
45320
+                        internal_funcs,
45321
+                        contained_host_refs,
45322
+                        descriptor_params,
4530145323
                     ) {
4530245324
                         return result;
4530345325
                     }
@@ -45402,19 +45424,17 @@ fn lower_expr_full(
4540245424
                     }
4540345425
 
4540445426
                     // Check for array intrinsics (SIZE, SUM, etc.) that need descriptor addresses.
45405
-                    if let Some(result) =
45406
-                            lower_array_intrinsic(
45407
-                                b,
45408
-                                locals,
45409
-                                &key,
45410
-                                args,
45411
-                                st,
45412
-                                type_layouts,
45413
-                                internal_funcs,
45414
-                                contained_host_refs,
45415
-                                descriptor_params,
45416
-                            )
45417
-                    {
45427
+                    if let Some(result) = lower_array_intrinsic(
45428
+                        b,
45429
+                        locals,
45430
+                        &key,
45431
+                        args,
45432
+                        st,
45433
+                        type_layouts,
45434
+                        internal_funcs,
45435
+                        contained_host_refs,
45436
+                        descriptor_params,
45437
+                    ) {
4541845438
                         return result;
4541945439
                     }
4542045440
 
@@ -45666,8 +45686,7 @@ fn lower_expr_full(
4566645686
                                         tmp
4566745687
                                     }
4566845688
                                 };
45669
-                                let re_ptr =
45670
-                                    b.gep(buf, vec![zero_off], IrType::Int(IntWidth::I8));
45689
+                                let re_ptr = b.gep(buf, vec![zero_off], IrType::Int(IntWidth::I8));
4567145690
                                 let im_ptr =
4567245691
                                     b.gep(buf, vec![lane_bytes], IrType::Int(IntWidth::I8));
4567345692
                                 let re_in = b.load_typed(re_ptr, elem.clone());
@@ -45698,8 +45717,7 @@ fn lower_expr_full(
4569845717
                                 let half_plus_pos = b.fcmp(CmpOp::Ge, half_plus, zero_f);
4569945718
                                 let half_plus_safe = b.select(half_plus_pos, half_plus, zero_f);
4570045719
                                 let half_minus_pos = b.fcmp(CmpOp::Ge, half_minus, zero_f);
45701
-                                let half_minus_safe =
45702
-                                    b.select(half_minus_pos, half_minus, zero_f);
45720
+                                let half_minus_safe = b.select(half_minus_pos, half_minus, zero_f);
4570345721
                                 let re_out = b.fsqrt(half_plus_safe);
4570445722
                                 let im_mag = b.fsqrt(half_minus_safe);
4570545723
                                 let im_neg = b.fneg(im_mag);
@@ -45707,8 +45725,7 @@ fn lower_expr_full(
4570745725
                                 let im_out = b.select(b_nonneg, im_mag, im_neg);
4570845726
 
4570945727
                                 let out = b.alloca(arr_ty);
45710
-                                let out_re =
45711
-                                    b.gep(out, vec![zero_off], IrType::Int(IntWidth::I8));
45728
+                                let out_re = b.gep(out, vec![zero_off], IrType::Int(IntWidth::I8));
4571245729
                                 let out_im =
4571345730
                                     b.gep(out, vec![lane_bytes], IrType::Int(IntWidth::I8));
4571445731
                                 b.store(re_out, out_re);
@@ -45789,14 +45806,10 @@ fn lower_expr_full(
4578945806
                 {
4579045807
                     if let Some(arg) = args.first() {
4579145808
                         if let crate::ast::expr::SectionSubscript::Element(arg_expr) = &arg.value {
45792
-                            if let Some(elem_ty) = ast_arg_element_ir_type(
45793
-                                arg_expr,
45794
-                                locals,
45795
-                                st,
45796
-                                type_layouts,
45797
-                            ) {
45798
-                                if let Some(v) = lower_numeric_inquiry_constant(b, &key, &elem_ty)
45799
-                                {
45809
+                            if let Some(elem_ty) =
45810
+                                ast_arg_element_ir_type(arg_expr, locals, st, type_layouts)
45811
+                            {
45812
+                                if let Some(v) = lower_numeric_inquiry_constant(b, &key, &elem_ty) {
4580045813
                                     return v;
4580145814
                                 }
4580245815
                             }
@@ -46294,17 +46307,14 @@ fn lower_expr_full(
4629446307
                                 {
4629546308
                                     let abi_lookup_keys =
4629646309
                                         procedure_abi_lookup_keys(st, &[&signature_key]);
46297
-                                    let ret_ty = first_procedure_lookup(
46298
-                                        &abi_lookup_keys,
46299
-                                        |k| callee_return_ir_type(st, k),
46300
-                                    )
46310
+                                    let ret_ty = first_procedure_lookup(&abi_lookup_keys, |k| {
46311
+                                        callee_return_ir_type(st, k)
46312
+                                    })
4630146313
                                     .unwrap_or(IrType::Int(IntWidth::I32));
46302
-                                    let mut arg_vals: Vec<ValueId> =
46303
-                                        Vec::with_capacity(args.len());
46314
+                                    let mut arg_vals: Vec<ValueId> = Vec::with_capacity(args.len());
4630446315
                                     for arg in args {
46305
-                                        if let crate::ast::expr::SectionSubscript::Element(
46306
-                                            e,
46307
-                                        ) = &arg.value
46316
+                                        if let crate::ast::expr::SectionSubscript::Element(e) =
46317
+                                            &arg.value
4630846318
                                         {
4630946319
                                             arg_vals.push(lower_arg_by_ref_full(
4631046320
                                                 b,
@@ -46318,272 +46328,211 @@ fn lower_expr_full(
4631846328
                                             ));
4631946329
                                         }
4632046330
                                     }
46321
-                                    return b.call(
46322
-                                        FuncRef::Indirect(target_ptr),
46323
-                                        arg_vals,
46324
-                                        ret_ty,
46325
-                                    );
46331
+                                    return b.call(FuncRef::Indirect(target_ptr), arg_vals, ret_ty);
4632646332
                                 }
4632746333
                             }
4632846334
                             let bp = bp_opt.unwrap_or_else(|| {
4632946335
                                 fail_unmatched_bound_proc_resolution(callee.span, layout, component)
4633046336
                             });
46331
-                                let target = bp.target_name.clone();
46332
-                                let target_key = abi_key_for_link_name(st, &target)
46333
-                                    .unwrap_or_else(|| bp.abi_name.clone());
46334
-                                let call_name = target.clone();
46335
-                                let nopass = bp.nopass;
46336
-                                let arg_slots = reorder_args_by_keyword_slots_with_formal_skip(
46337
-                                    args,
46338
-                                    &target_key,
46339
-                                    st,
46340
-                                    if nopass { 0 } else { 1 },
46341
-                                );
46342
-                                let abi_lookup_keys = procedure_abi_lookup_keys(
46337
+                            let target = bp.target_name.clone();
46338
+                            let target_key = abi_key_for_link_name(st, &target)
46339
+                                .unwrap_or_else(|| bp.abi_name.clone());
46340
+                            let call_name = target.clone();
46341
+                            let nopass = bp.nopass;
46342
+                            let arg_slots = reorder_args_by_keyword_slots_with_formal_skip(
46343
+                                args,
46344
+                                &target_key,
46345
+                                st,
46346
+                                if nopass { 0 } else { 1 },
46347
+                            );
46348
+                            let abi_lookup_keys =
46349
+                                procedure_abi_lookup_keys(st, &[call_name.as_str(), &target_key]);
46350
+                            let abi_primary_key = abi_lookup_keys
46351
+                                .first()
46352
+                                .map(String::as_str)
46353
+                                .unwrap_or(target_key.as_str());
46354
+                            if let Some(hidden_abi) =
46355
+                                first_procedure_lookup(&abi_lookup_keys, |k| {
46356
+                                    callee_hidden_result_abi(st, k)
46357
+                                })
46358
+                            {
46359
+                                if let Some((raw, typed)) = allocate_hidden_result_buffer(
46360
+                                    b,
4634346361
                                     st,
46344
-                                    &[call_name.as_str(), &target_key],
46345
-                                );
46346
-                                let abi_primary_key = abi_lookup_keys
46347
-                                    .first()
46348
-                                    .map(String::as_str)
46349
-                                    .unwrap_or(target_key.as_str());
46350
-                                if let Some(hidden_abi) =
46351
-                                    first_procedure_lookup(&abi_lookup_keys, |k| {
46352
-                                        callee_hidden_result_abi(st, k)
46353
-                                    })
46354
-                                {
46355
-                                    if let Some((raw, typed)) = allocate_hidden_result_buffer(
46362
+                                    type_layouts,
46363
+                                    &abi_lookup_keys,
46364
+                                    hidden_abi,
46365
+                                ) {
46366
+                                    emit_bound_function_call(
4635646367
                                         b,
46368
+                                        locals,
4635746369
                                         st,
4635846370
                                         type_layouts,
46359
-                                        &abi_lookup_keys,
46360
-                                        hidden_abi,
46361
-                                    ) {
46362
-                                        emit_bound_function_call(
46363
-                                            b,
46364
-                                            locals,
46365
-                                            st,
46366
-                                            type_layouts,
46367
-                                            internal_funcs,
46368
-                                            contained_host_refs,
46369
-                                            descriptor_params,
46370
-                                            callee.span,
46371
-                                            base,
46372
-                                            component,
46373
-                                            args,
46374
-                                            Some(raw),
46375
-                                            IrType::Void,
46376
-                                        );
46377
-                                        return typed;
46378
-                                    }
46371
+                                        internal_funcs,
46372
+                                        contained_host_refs,
46373
+                                        descriptor_params,
46374
+                                        callee.span,
46375
+                                        base,
46376
+                                        component,
46377
+                                        args,
46378
+                                        Some(raw),
46379
+                                        IrType::Void,
46380
+                                    );
46381
+                                    return typed;
4637946382
                                 }
46380
-                                let callee_value_args =
46381
-                                    first_procedure_lookup(&abi_lookup_keys, |k| {
46382
-                                        callee_value_arg_mask(st, k)
46383
-                                    });
46384
-                                let callee_descriptor_args =
46385
-                                    first_procedure_lookup(&abi_lookup_keys, |k| {
46386
-                                        descriptor_params
46387
-                                            .and_then(|m| cached_param_mask_for_lookup(st, m, k))
46388
-                                    });
46389
-                                let callee_string_descriptor_args =
46390
-                                    first_procedure_lookup(&abi_lookup_keys, |k| {
46391
-                                        callee_string_descriptor_arg_mask(st, k)
46392
-                                    });
46393
-                                let callee_bind_c_char_args =
46394
-                                    first_procedure_lookup(&abi_lookup_keys, |k| {
46395
-                                        callee_bind_c_char_arg_mask(st, k)
46396
-                                    });
46397
-                                let callee_pointer_args =
46398
-                                    first_procedure_lookup(&abi_lookup_keys, |k| {
46399
-                                        callee_pointer_arg_mask(st, k)
46400
-                                    });
46401
-                                let opt_flags = first_procedure_lookup(&abi_lookup_keys, |k| {
46402
-                                    callee_optional_arg_mask(st, k)
46383
+                            }
46384
+                            let callee_value_args = first_procedure_lookup(&abi_lookup_keys, |k| {
46385
+                                callee_value_arg_mask(st, k)
46386
+                            });
46387
+                            let callee_descriptor_args =
46388
+                                first_procedure_lookup(&abi_lookup_keys, |k| {
46389
+                                    descriptor_params
46390
+                                        .and_then(|m| cached_param_mask_for_lookup(st, m, k))
46391
+                                });
46392
+                            let callee_string_descriptor_args =
46393
+                                first_procedure_lookup(&abi_lookup_keys, |k| {
46394
+                                    callee_string_descriptor_arg_mask(st, k)
46395
+                                });
46396
+                            let callee_bind_c_char_args =
46397
+                                first_procedure_lookup(&abi_lookup_keys, |k| {
46398
+                                    callee_bind_c_char_arg_mask(st, k)
46399
+                                });
46400
+                            let callee_pointer_args =
46401
+                                first_procedure_lookup(&abi_lookup_keys, |k| {
46402
+                                    callee_pointer_arg_mask(st, k)
46403
+                                });
46404
+                            let opt_flags = first_procedure_lookup(&abi_lookup_keys, |k| {
46405
+                                callee_optional_arg_mask(st, k)
46406
+                            });
46407
+                            let callee_char_len_star_args =
46408
+                                first_procedure_lookup(&abi_lookup_keys, |k| {
46409
+                                    callee_char_len_star_mask(st, k)
4640346410
                                 });
46404
-                                let callee_char_len_star_args =
46405
-                                    first_procedure_lookup(&abi_lookup_keys, |k| {
46406
-                                        callee_char_len_star_mask(st, k)
46407
-                                    });
4640846411
 
46409
-                                let mut call_args = Vec::with_capacity(arg_slots.len() + 1);
46410
-                                for (i, slot) in arg_slots.iter().enumerate() {
46411
-                                    if !nopass && i == 0 {
46412
-                                        let wants_bind_c_char = callee_bind_c_char_args
46413
-                                            .as_ref()
46414
-                                            .map(|mask| mask.first().copied().unwrap_or(false))
46415
-                                            .unwrap_or(false);
46416
-                                        let wants_descriptor = callee_descriptor_args
46417
-                                            .as_ref()
46418
-                                            .map(|mask| mask.first().copied().unwrap_or(false))
46419
-                                            .unwrap_or(false)
46420
-                                            && !wants_bind_c_char;
46421
-                                        call_args.push(if wants_descriptor {
46422
-                                            lower_arg_descriptor(
46423
-                                                b,
46424
-                                                locals,
46425
-                                                base,
46426
-                                                st,
46427
-                                                type_layouts,
46428
-                                                false,
46429
-                                            )
46430
-                                        } else {
46431
-                                            obj_addr
46432
-                                        });
46433
-                                        continue;
46434
-                                    }
46435
-                                    let is_value = callee_value_args
46436
-                                        .as_ref()
46437
-                                        .map(|mask| mask.get(i).copied().unwrap_or(false))
46438
-                                        .unwrap_or(false);
46439
-                                    let wants_descriptor = callee_descriptor_args
46440
-                                        .as_ref()
46441
-                                        .map(|mask| mask.get(i).copied().unwrap_or(false))
46442
-                                        .unwrap_or(false);
46443
-                                    let wants_string_descriptor = callee_string_descriptor_args
46444
-                                        .as_ref()
46445
-                                        .map(|mask| mask.get(i).copied().unwrap_or(false))
46446
-                                        .unwrap_or(false);
46412
+                            let mut call_args = Vec::with_capacity(arg_slots.len() + 1);
46413
+                            for (i, slot) in arg_slots.iter().enumerate() {
46414
+                                if !nopass && i == 0 {
4644746415
                                     let wants_bind_c_char = callee_bind_c_char_args
4644846416
                                         .as_ref()
46449
-                                        .map(|mask| mask.get(i).copied().unwrap_or(false))
46417
+                                        .map(|mask| mask.first().copied().unwrap_or(false))
4645046418
                                         .unwrap_or(false);
46451
-                                    let wants_descriptor = wants_descriptor && !wants_bind_c_char;
46452
-                                    let wants_string_descriptor =
46453
-                                        wants_string_descriptor && !wants_bind_c_char;
46454
-                                    let wants_pointer = callee_pointer_args
46419
+                                    let wants_descriptor = callee_descriptor_args
4645546420
                                         .as_ref()
46456
-                                        .map(|mask| mask.get(i).copied().unwrap_or(false))
46457
-                                        .unwrap_or(false);
46458
-                                    let value = match slot {
46459
-                                        Some(arg) => match &arg.value {
46460
-                                            crate::ast::expr::SectionSubscript::Element(e) => {
46461
-                                                if is_value && wants_bind_c_char {
46462
-                                                    lower_bind_c_char_value_arg(
46463
-                                                        b,
46464
-                                                        locals,
46465
-                                                        e,
46466
-                                                        st,
46467
-                                                        type_layouts,
46468
-                                                        internal_funcs,
46469
-                                                        contained_host_refs,
46470
-                                                        descriptor_params,
46471
-                                                    )
46472
-                                                } else if is_value {
46473
-                                                    let raw = lower_expr_full(
46474
-                                                        b,
46475
-                                                        locals,
46476
-                                                        e,
46477
-                                                        st,
46478
-                                                        type_layouts,
46479
-                                                        internal_funcs,
46480
-                                                        contained_host_refs,
46481
-                                                        descriptor_params,
46482
-                                                    );
46483
-                                                    coerce_value_call_arg(
46484
-                                                        b,
46485
-                                                        st,
46486
-                                                        abi_primary_key,
46487
-                                                        i,
46488
-                                                        raw,
46489
-                                                    )
46490
-                                                } else if wants_descriptor {
46491
-                                                    lower_arg_descriptor(
46492
-                                                        b,
46493
-                                                        locals,
46494
-                                                        e,
46495
-                                                        st,
46496
-                                                        type_layouts,
46497
-                                                        false,
46498
-                                                    )
46499
-                                                } else if wants_string_descriptor {
46500
-                                                    lower_arg_string_descriptor(
46501
-                                                        b,
46502
-                                                        locals,
46503
-                                                        e,
46504
-                                                        st,
46505
-                                                        type_layouts,
46506
-                                                    )
46507
-                                                } else if wants_bind_c_char {
46508
-                                                    lower_bind_c_char_arg_raw(
46509
-                                                        b,
46510
-                                                        locals,
46511
-                                                        e,
46512
-                                                        st,
46513
-                                                        type_layouts,
46514
-                                                        internal_funcs,
46515
-                                                        contained_host_refs,
46516
-                                                        descriptor_params,
46517
-                                                    )
46518
-                                                } else if wants_pointer {
46519
-                                                    lower_pointer_dummy_actual(
46520
-                                                        b,
46521
-                                                        locals,
46522
-                                                        e,
46523
-                                                        st,
46524
-                                                        type_layouts,
46525
-                                                        internal_funcs,
46526
-                                                        contained_host_refs,
46527
-                                                        descriptor_params,
46528
-                                                    )
46529
-                                                    .unwrap_or_else(|| {
46530
-                                                        lower_arg_by_ref_full(
46531
-                                                            b,
46532
-                                                            locals,
46533
-                                                            e,
46534
-                                                            st,
46535
-                                                            type_layouts,
46536
-                                                            internal_funcs,
46537
-                                                            contained_host_refs,
46538
-                                                            descriptor_params,
46539
-                                                        )
46540
-                                                    })
46541
-                                                } else {
46542
-                                                    lower_arg_by_ref_full(
46543
-                                                        b,
46544
-                                                        locals,
46545
-                                                        e,
46546
-                                                        st,
46547
-                                                        type_layouts,
46548
-                                                        internal_funcs,
46549
-                                                        contained_host_refs,
46550
-                                                        descriptor_params,
46551
-                                                    )
46552
-                                                }
46553
-                                            }
46554
-                                            _ => b.const_i32(0),
46555
-                                        },
46556
-                                        None => missing_optional_call_arg(
46421
+                                        .map(|mask| mask.first().copied().unwrap_or(false))
46422
+                                        .unwrap_or(false)
46423
+                                        && !wants_bind_c_char;
46424
+                                    call_args.push(if wants_descriptor {
46425
+                                        lower_arg_descriptor(
4655746426
                                             b,
46427
+                                            locals,
46428
+                                            base,
4655846429
                                             st,
46559
-                                            abi_primary_key,
46560
-                                            i,
46561
-                                            is_value,
46562
-                                        ),
46563
-                                    };
46564
-                                    call_args.push(value);
46565
-                                }
46566
-                                if let Some(opt_flags) = opt_flags {
46567
-                                    for flag in opt_flags.iter().skip(call_args.len()) {
46568
-                                        if *flag {
46569
-                                            call_args.push(b.const_i64(0));
46570
-                                        }
46571
-                                    }
46430
+                                            type_layouts,
46431
+                                            false,
46432
+                                        )
46433
+                                    } else {
46434
+                                        obj_addr
46435
+                                    });
46436
+                                    continue;
4657246437
                                 }
46573
-                                if let Some(cls_flags) = &callee_char_len_star_args {
46574
-                                    for (i, flag) in cls_flags.iter().enumerate() {
46575
-                                        if !*flag || i >= arg_slots.len() {
46576
-                                            continue;
46577
-                                        }
46578
-                                        if let Some(arg) = &arg_slots[i] {
46579
-                                            if let crate::ast::expr::SectionSubscript::Element(e) =
46580
-                                                &arg.value
46581
-                                            {
46582
-                                                call_args.push(
46583
-                                                    actual_char_arg_runtime_len(
46438
+                                let is_value = callee_value_args
46439
+                                    .as_ref()
46440
+                                    .map(|mask| mask.get(i).copied().unwrap_or(false))
46441
+                                    .unwrap_or(false);
46442
+                                let wants_descriptor = callee_descriptor_args
46443
+                                    .as_ref()
46444
+                                    .map(|mask| mask.get(i).copied().unwrap_or(false))
46445
+                                    .unwrap_or(false);
46446
+                                let wants_string_descriptor = callee_string_descriptor_args
46447
+                                    .as_ref()
46448
+                                    .map(|mask| mask.get(i).copied().unwrap_or(false))
46449
+                                    .unwrap_or(false);
46450
+                                let wants_bind_c_char = callee_bind_c_char_args
46451
+                                    .as_ref()
46452
+                                    .map(|mask| mask.get(i).copied().unwrap_or(false))
46453
+                                    .unwrap_or(false);
46454
+                                let wants_descriptor = wants_descriptor && !wants_bind_c_char;
46455
+                                let wants_string_descriptor =
46456
+                                    wants_string_descriptor && !wants_bind_c_char;
46457
+                                let wants_pointer = callee_pointer_args
46458
+                                    .as_ref()
46459
+                                    .map(|mask| mask.get(i).copied().unwrap_or(false))
46460
+                                    .unwrap_or(false);
46461
+                                let value = match slot {
46462
+                                    Some(arg) => match &arg.value {
46463
+                                        crate::ast::expr::SectionSubscript::Element(e) => {
46464
+                                            if is_value && wants_bind_c_char {
46465
+                                                lower_bind_c_char_value_arg(
46466
+                                                    b,
46467
+                                                    locals,
46468
+                                                    e,
46469
+                                                    st,
46470
+                                                    type_layouts,
46471
+                                                    internal_funcs,
46472
+                                                    contained_host_refs,
46473
+                                                    descriptor_params,
46474
+                                                )
46475
+                                            } else if is_value {
46476
+                                                let raw = lower_expr_full(
46477
+                                                    b,
46478
+                                                    locals,
46479
+                                                    e,
46480
+                                                    st,
46481
+                                                    type_layouts,
46482
+                                                    internal_funcs,
46483
+                                                    contained_host_refs,
46484
+                                                    descriptor_params,
46485
+                                                );
46486
+                                                coerce_value_call_arg(
46487
+                                                    b,
46488
+                                                    st,
46489
+                                                    abi_primary_key,
46490
+                                                    i,
46491
+                                                    raw,
46492
+                                                )
46493
+                                            } else if wants_descriptor {
46494
+                                                lower_arg_descriptor(
46495
+                                                    b,
46496
+                                                    locals,
46497
+                                                    e,
46498
+                                                    st,
46499
+                                                    type_layouts,
46500
+                                                    false,
46501
+                                                )
46502
+                                            } else if wants_string_descriptor {
46503
+                                                lower_arg_string_descriptor(
46504
+                                                    b,
46505
+                                                    locals,
46506
+                                                    e,
46507
+                                                    st,
46508
+                                                    type_layouts,
46509
+                                                )
46510
+                                            } else if wants_bind_c_char {
46511
+                                                lower_bind_c_char_arg_raw(
46512
+                                                    b,
46513
+                                                    locals,
46514
+                                                    e,
46515
+                                                    st,
46516
+                                                    type_layouts,
46517
+                                                    internal_funcs,
46518
+                                                    contained_host_refs,
46519
+                                                    descriptor_params,
46520
+                                                )
46521
+                                            } else if wants_pointer {
46522
+                                                lower_pointer_dummy_actual(
46523
+                                                    b,
46524
+                                                    locals,
46525
+                                                    e,
46526
+                                                    st,
46527
+                                                    type_layouts,
46528
+                                                    internal_funcs,
46529
+                                                    contained_host_refs,
46530
+                                                    descriptor_params,
46531
+                                                )
46532
+                                                .unwrap_or_else(|| {
46533
+                                                    lower_arg_by_ref_full(
4658446534
                                                         b,
4658546535
                                                         locals,
46586
-                                                        None,
4658746536
                                                         e,
4658846537
                                                         st,
4658946538
                                                         type_layouts,
@@ -46591,36 +46540,90 @@ fn lower_expr_full(
4659146540
                                                         contained_host_refs,
4659246541
                                                         descriptor_params,
4659346542
                                                     )
46594
-                                                    .unwrap_or_else(|| b.const_i64(0)),
46595
-                                                );
46543
+                                                })
4659646544
                                             } else {
46597
-                                                call_args.push(b.const_i64(0));
46545
+                                                lower_arg_by_ref_full(
46546
+                                                    b,
46547
+                                                    locals,
46548
+                                                    e,
46549
+                                                    st,
46550
+                                                    type_layouts,
46551
+                                                    internal_funcs,
46552
+                                                    contained_host_refs,
46553
+                                                    descriptor_params,
46554
+                                                )
4659846555
                                             }
46556
+                                        }
46557
+                                        _ => b.const_i32(0),
46558
+                                    },
46559
+                                    None => missing_optional_call_arg(
46560
+                                        b,
46561
+                                        st,
46562
+                                        abi_primary_key,
46563
+                                        i,
46564
+                                        is_value,
46565
+                                    ),
46566
+                                };
46567
+                                call_args.push(value);
46568
+                            }
46569
+                            if let Some(opt_flags) = opt_flags {
46570
+                                for flag in opt_flags.iter().skip(call_args.len()) {
46571
+                                    if *flag {
46572
+                                        call_args.push(b.const_i64(0));
46573
+                                    }
46574
+                                }
46575
+                            }
46576
+                            if let Some(cls_flags) = &callee_char_len_star_args {
46577
+                                for (i, flag) in cls_flags.iter().enumerate() {
46578
+                                    if !*flag || i >= arg_slots.len() {
46579
+                                        continue;
46580
+                                    }
46581
+                                    if let Some(arg) = &arg_slots[i] {
46582
+                                        if let crate::ast::expr::SectionSubscript::Element(e) =
46583
+                                            &arg.value
46584
+                                        {
46585
+                                            call_args.push(
46586
+                                                actual_char_arg_runtime_len(
46587
+                                                    b,
46588
+                                                    locals,
46589
+                                                    None,
46590
+                                                    e,
46591
+                                                    st,
46592
+                                                    type_layouts,
46593
+                                                    internal_funcs,
46594
+                                                    contained_host_refs,
46595
+                                                    descriptor_params,
46596
+                                                )
46597
+                                                .unwrap_or_else(|| b.const_i64(0)),
46598
+                                            );
4659946599
                                         } else {
4660046600
                                             call_args.push(b.const_i64(0));
4660146601
                                         }
46602
+                                    } else {
46603
+                                        call_args.push(b.const_i64(0));
4660246604
                                     }
4660346605
                                 }
46606
+                            }
4660446607
 
46605
-                                let ret_ty = first_procedure_lookup(&abi_lookup_keys, |k| {
46606
-                                    callee_return_ir_type(st, k)
46607
-                                })
46608
-                                .unwrap_or(IrType::Int(IntWidth::I32));
46609
-                                let call_result =
46610
-                                    b.call(FuncRef::External(call_name), call_args, ret_ty);
46611
-                                if let Some(tl) = type_layouts {
46612
-                                    if let Some(type_name) =
46613
-                                        callee_return_stabilized_derived_type_name(st, &target_key)
46614
-                                    {
46615
-                                        return stabilize_derived_call_result(
46616
-                                            b,
46617
-                                            tl,
46618
-                                            &type_name,
46619
-                                            call_result,
46620
-                                        );
46621
-                                    }
46608
+                            let ret_ty = first_procedure_lookup(&abi_lookup_keys, |k| {
46609
+                                callee_return_ir_type(st, k)
46610
+                            })
46611
+                            .unwrap_or(IrType::Int(IntWidth::I32));
46612
+                            let call_result =
46613
+                                b.call(FuncRef::External(call_name), call_args, ret_ty);
46614
+                            if let Some(tl) = type_layouts {
46615
+                                if let Some(type_name) =
46616
+                                    callee_return_stabilized_derived_type_name(st, &target_key)
46617
+                                {
46618
+                                    return stabilize_derived_call_result(
46619
+                                        b,
46620
+                                        tl,
46621
+                                        &type_name,
46622
+                                        call_result,
46623
+                                    );
4662246624
                                 }
46623
-                                return call_result;
46625
+                            }
46626
+                            return call_result;
4662446627
                         }
4662546628
                     }
4662646629
                     reject_unsupported_polymorphic_component_method_base(
@@ -46664,11 +46667,7 @@ fn lower_expr_full(
4666446667
                         contained_host_refs,
4666546668
                         descriptor_params,
4666646669
                     );
46667
-                    let off = if lc_component == "re" {
46668
-                        0
46669
-                    } else {
46670
-                        kind_bytes
46671
-                    };
46670
+                    let off = if lc_component == "re" { 0 } else { kind_bytes };
4667246671
                     let off_v = b.const_i64(off);
4667346672
                     let lane_ptr = b.gep(base_addr, vec![off_v], IrType::Int(IntWidth::I8));
4667446673
                     return b.load_typed(lane_ptr, elem_ty);
@@ -46926,7 +46925,12 @@ fn lower_expr_full(
4692646925
                         return true;
4692746926
                     }
4692846927
                     if let Some(kind_str) = kind {
46929
-                        return real_kind_to_width_in_context(kind_str, Some(locals), None, Some(st)) == 8;
46928
+                        return real_kind_to_width_in_context(
46929
+                            kind_str,
46930
+                            Some(locals),
46931
+                            None,
46932
+                            Some(st),
46933
+                        ) == 8;
4693046934
                     }
4693146935
                 }
4693246936
                 false
@@ -47068,12 +47072,8 @@ fn try_lower_transfer_into_array(
4706847072
     };
4706947073
 
4707047074
     // Mold scalar byte size from the mold's semantic type.
47071
-    let mold_ti = operator_expr_type_info(
47072
-        mold_expr,
47073
-        Some(&ctx.locals),
47074
-        ctx.st,
47075
-        Some(ctx.type_layouts),
47076
-    );
47075
+    let mold_ti =
47076
+        operator_expr_type_info(mold_expr, Some(&ctx.locals), ctx.st, Some(ctx.type_layouts));
4707747077
     let scalar_size: i64 = match mold_ti {
4707847078
         Some(crate::sema::symtab::TypeInfo::Integer { kind }) => kind.unwrap_or(4) as i64,
4707947079
         Some(crate::sema::symtab::TypeInfo::Real { kind }) => kind.unwrap_or(4) as i64,
@@ -47091,9 +47091,7 @@ fn try_lower_transfer_into_array(
4709147091
     // MOLD_elem_size)` (F2018 §16.9.193) — derive that from the source
4709247092
     // array descriptor at runtime, which only works for descriptor-
4709347093
     // backed destinations (fixed-shape molds need a static extent).
47094
-    let const_size: Option<i64> = size_expr_opt
47095
-        .and_then(eval_const_int)
47096
-        .filter(|s| *s >= 1);
47094
+    let const_size: Option<i64> = size_expr_opt.and_then(eval_const_int).filter(|s| *s >= 1);
4709747095
     let descriptor_dest = local_uses_array_descriptor(dest_info);
4709847096
     let (size_v, total_v): (ValueId, ValueId) = if let Some(size) = const_size {
4709947097
         let total_bytes = size * scalar_size;
@@ -47141,20 +47139,13 @@ fn try_lower_transfer_into_array(
4714147139
                     let crate::ast::expr::AcValue::Expr(expr) = v else {
4714247140
                         return None;
4714347141
                     };
47144
-                    operator_expr_type_info(
47145
-                        expr,
47146
-                        Some(&ctx.locals),
47147
-                        ctx.st,
47148
-                        Some(ctx.type_layouts),
47149
-                    )
47142
+                    operator_expr_type_info(expr, Some(&ctx.locals), ctx.st, Some(ctx.type_layouts))
4715047143
                 });
4715147144
                 let src_elem_size: i64 = match elem_ti {
4715247145
                     Some(crate::sema::symtab::TypeInfo::Integer { kind }) => {
4715347146
                         kind.unwrap_or(4) as i64
4715447147
                     }
47155
-                    Some(crate::sema::symtab::TypeInfo::Real { kind }) => {
47156
-                        kind.unwrap_or(4) as i64
47157
-                    }
47148
+                    Some(crate::sema::symtab::TypeInfo::Real { kind }) => kind.unwrap_or(4) as i64,
4715847149
                     Some(crate::sema::symtab::TypeInfo::Logical { kind }) => {
4715947150
                         kind.unwrap_or(4) as i64
4716047151
                     }
@@ -47360,15 +47351,9 @@ fn lower_transfer_intrinsic(
4736047351
     // mishandle.
4736147352
     let mold_ti = operator_expr_type_info(mold_expr, Some(locals), st, type_layouts)?;
4736247353
     let mold_ty = match &mold_ti {
47363
-        crate::sema::symtab::TypeInfo::Integer { kind } => {
47364
-            IrType::int_from_kind(kind.unwrap_or(4))
47365
-        }
47366
-        crate::sema::symtab::TypeInfo::Real { kind } => {
47367
-            IrType::float_from_kind(kind.unwrap_or(4))
47368
-        }
47369
-        crate::sema::symtab::TypeInfo::Logical { kind } => {
47370
-            IrType::int_from_kind(kind.unwrap_or(4))
47371
-        }
47354
+        crate::sema::symtab::TypeInfo::Integer { kind } => IrType::int_from_kind(kind.unwrap_or(4)),
47355
+        crate::sema::symtab::TypeInfo::Real { kind } => IrType::float_from_kind(kind.unwrap_or(4)),
47356
+        crate::sema::symtab::TypeInfo::Logical { kind } => IrType::int_from_kind(kind.unwrap_or(4)),
4737247357
         _ => return None,
4737347358
     };
4737447359
 
@@ -47405,10 +47390,19 @@ fn lower_transfer_intrinsic(
4740547390
                 return None;
4740647391
             };
4740747392
             let elem_val = lower_expr_full(
47408
-                b, locals, e, st, type_layouts,
47409
-                internal_funcs, contained_host_refs, descriptor_params,
47393
+                b,
47394
+                locals,
47395
+                e,
47396
+                st,
47397
+                type_layouts,
47398
+                internal_funcs,
47399
+                contained_host_refs,
47400
+                descriptor_params,
4741047401
             );
47411
-            let elem_ty = b.func().value_type(elem_val).unwrap_or(IrType::Int(IntWidth::I32));
47402
+            let elem_ty = b
47403
+                .func()
47404
+                .value_type(elem_val)
47405
+                .unwrap_or(IrType::Int(IntWidth::I32));
4741247406
             let elem_size = ir_scalar_byte_size(&elem_ty);
4741347407
             let off_val = b.const_i64(byte_off);
4741447408
             let dst = b.gep(buf, vec![off_val], IrType::Int(IntWidth::I8));
@@ -47420,10 +47414,19 @@ fn lower_transfer_intrinsic(
4742047414
 
4742147415
     // Scalar source: lower it, store to temp, reload as mold type.
4742247416
     let src_val = lower_expr_full(
47423
-        b, locals, source_expr, st, type_layouts,
47424
-        internal_funcs, contained_host_refs, descriptor_params,
47417
+        b,
47418
+        locals,
47419
+        source_expr,
47420
+        st,
47421
+        type_layouts,
47422
+        internal_funcs,
47423
+        contained_host_refs,
47424
+        descriptor_params,
4742547425
     );
47426
-    let src_ty = b.func().value_type(src_val).unwrap_or(IrType::Int(IntWidth::I32));
47426
+    let src_ty = b
47427
+        .func()
47428
+        .value_type(src_val)
47429
+        .unwrap_or(IrType::Int(IntWidth::I32));
4742747430
     if matches!(src_ty, IrType::Int(_) | IrType::Float(_) | IrType::Bool) {
4742847431
         let zero_off = b.const_i64(0);
4742947432
         let dst = b.gep(buf, vec![zero_off], IrType::Int(IntWidth::I8));
src/parser/decl.rsmodified
@@ -647,7 +647,11 @@ impl<'a> Parser<'a> {
647647
                 self.advance();
648648
                 let kind = self.advance().clone().text;
649649
                 self.expect(&TokenKind::RParen)?;
650
-                name = format!("{}({})", name.to_ascii_lowercase(), kind.to_ascii_lowercase());
650
+                name = format!(
651
+                    "{}({})",
652
+                    name.to_ascii_lowercase(),
653
+                    kind.to_ascii_lowercase()
654
+                );
651655
                 is_generic_spec = true;
652656
             }
653657
             if self.eat(&TokenKind::Arrow) {
@@ -927,10 +931,8 @@ impl<'a> Parser<'a> {
927931
                                 // the field is zero-initialised).
928932
                             } else if self.peek() == &TokenKind::Identifier {
929933
                                 let target_name = self.advance().clone().text;
930
-                                let span = crate::parser::expr::span_from_to(
931
-                                    init_start,
932
-                                    self.prev_span(),
933
-                                );
934
+                                let span =
935
+                                    crate::parser::expr::span_from_to(init_start, self.prev_span());
934936
                                 ptr_init = Some(crate::ast::Spanned::new(
935937
                                     crate::ast::expr::Expr::Name { name: target_name },
936938
                                     span,
@@ -1395,8 +1397,7 @@ mod tests {
13951397
     #[test]
13961398
     fn generic_type_bound_proc_preserves_all_specific_bindings() {
13971399
         let tokens =
1398
-            Lexer::tokenize("generic :: set => set_float, set_integer, set_datetime", 0)
1399
-                .unwrap();
1400
+            Lexer::tokenize("generic :: set => set_float, set_integer, set_datetime", 0).unwrap();
14001401
         let mut parser = Parser::new(&tokens);
14011402
         parser.advance();
14021403
         let tbp = parser.parse_type_bound_proc_generic().unwrap();
src/parser/stmt.rsmodified
@@ -628,7 +628,10 @@ impl<'a> Parser<'a> {
628628
                     let rank_expr = self.parse_expr()?;
629629
                     let rank_val = match &rank_expr.node {
630630
                         Expr::IntegerLiteral { text, .. } => text.parse::<i64>().unwrap_or(0),
631
-                        Expr::UnaryOp { op: crate::ast::expr::UnaryOp::Minus, operand } => {
631
+                        Expr::UnaryOp {
632
+                            op: crate::ast::expr::UnaryOp::Minus,
633
+                            operand,
634
+                        } => {
632635
                             if let Expr::IntegerLiteral { text, .. } = &operand.node {
633636
                                 -text.parse::<i64>().unwrap_or(0)
634637
                             } else {
@@ -639,7 +642,10 @@ impl<'a> Parser<'a> {
639642
                     };
640643
                     self.expect(&TokenKind::RParen)?;
641644
                     let body = self.parse_select_rank_body()?;
642
-                    guards.push(RankGuard::Rank { rank: rank_val, body });
645
+                    guards.push(RankGuard::Rank {
646
+                        rank: rank_val,
647
+                        body,
648
+                    });
643649
                 }
644650
             }
645651
         }
src/parser/unit.rsmodified
@@ -75,17 +75,11 @@ impl<'a> Parser<'a> {
7575
                     } else {
7676
                         String::new()
7777
                     };
78
-                    let is_simple_prefix = matches!(
79
-                        next.as_str(),
80
-                        "subroutine" | "function" | "procedure"
81
-                    );
78
+                    let is_simple_prefix =
79
+                        matches!(next.as_str(), "subroutine" | "function" | "procedure");
8280
                     let is_followed_by_decl_prefix = matches!(
8381
                         next.as_str(),
84
-                        "pure"
85
-                            | "impure"
86
-                            | "elemental"
87
-                            | "recursive"
88
-                            | "non_recursive"
82
+                        "pure" | "impure" | "elemental" | "recursive" | "non_recursive"
8983
                     );
9084
                     let is_type_then_function = matches!(
9185
                         next.as_str(),
@@ -98,10 +92,7 @@ impl<'a> Parser<'a> {
9892
                             | "type"
9993
                             | "class"
10094
                     );
101
-                    if is_simple_prefix
102
-                        || is_followed_by_decl_prefix
103
-                        || is_type_then_function
104
-                    {
95
+                    if is_simple_prefix || is_followed_by_decl_prefix || is_type_then_function {
10596
                         self.advance();
10697
                         prefixes.push(Prefix::Module);
10798
                     } else {
@@ -133,11 +124,7 @@ impl<'a> Parser<'a> {
133124
             // parent module's interface block, so args/return type
134125
             // are not repeated here.  Only valid when the `module`
135126
             // prefix was consumed above.
136
-            "procedure"
137
-                if prefixes
138
-                    .iter()
139
-                    .any(|p| matches!(p, Prefix::Module)) =>
140
-            {
127
+            "procedure" if prefixes.iter().any(|p| matches!(p, Prefix::Module)) => {
141128
                 self.parse_separate_module_procedure(start, prefixes)
142129
             }
143130
             "blockdata" | "block" => {
@@ -483,11 +470,10 @@ impl<'a> Parser<'a> {
483470
         // Optional name or generic spec.
484471
         // Check generic specs BEFORE generic identifier — they lex as identifiers.
485472
         let kw_lc = self.peek_text().to_lowercase();
486
-        let is_generic_spec = matches!(
487
-            kw_lc.as_str(),
488
-            "operator" | "assignment" | "read" | "write"
489
-        ) && self.pos + 1 < self.tokens.len()
490
-            && self.tokens[self.pos + 1].kind == TokenKind::LParen;
473
+        let is_generic_spec =
474
+            matches!(kw_lc.as_str(), "operator" | "assignment" | "read" | "write")
475
+                && self.pos + 1 < self.tokens.len()
476
+                && self.tokens[self.pos + 1].kind == TokenKind::LParen;
491477
         let name = if is_generic_spec {
492478
             let op_kw = self.advance().clone().text;
493479
             self.expect(&TokenKind::LParen)?;
@@ -1004,10 +990,8 @@ impl<'a> Parser<'a> {
1004990
         }
1005991
 
1006992
         let kw = self.peek_text().to_lowercase();
1007
-        let is_generic_spec = matches!(
1008
-            kw.as_str(),
1009
-            "operator" | "assignment" | "read" | "write"
1010
-        ) && self.pos + 1 < self.tokens.len()
993
+        let is_generic_spec = matches!(kw.as_str(), "operator" | "assignment" | "read" | "write")
994
+            && self.pos + 1 < self.tokens.len()
1011995
             && self.tokens[self.pos + 1].kind == TokenKind::LParen;
1012996
 
1013997
         if !is_generic_spec {
src/sema/amod.rsmodified
@@ -702,20 +702,14 @@ fn emit_procedure(
702702
                             && st.scope(parent_id).parent == Some(mod_scope_id)
703703
                 })
704704
                 .and_then(|pscope| {
705
-                    let arg_set: std::collections::HashSet<String> = pscope
706
-                        .arg_order
707
-                        .iter()
708
-                        .map(|n| n.to_lowercase())
709
-                        .collect();
705
+                    let arg_set: std::collections::HashSet<String> =
706
+                        pscope.arg_order.iter().map(|n| n.to_lowercase()).collect();
710707
                     pscope
711708
                         .symbols
712709
                         .iter()
713710
                         .find(|(key, sym)| {
714711
                             !arg_set.contains(*key)
715
-                                && matches!(
716
-                                    sym.kind,
717
-                                    SymbolKind::Variable | SymbolKind::Parameter
718
-                                )
712
+                                && matches!(sym.kind, SymbolKind::Variable | SymbolKind::Parameter)
719713
                         })
720714
                         .map(|(_, sym)| sym.attrs.array_spec.clone())
721715
                 })
@@ -860,7 +854,10 @@ fn emit_procedure(
860854
                         .and_then(|flags| flags.get(arg_idx))
861855
                         .copied()
862856
                         .unwrap_or(false)
863
-                    || matches!(arg_sym.type_info, Some(TypeInfo::Class(_)) | Some(TypeInfo::ClassStar));
857
+                    || matches!(
858
+                        arg_sym.type_info,
859
+                        Some(TypeInfo::Class(_)) | Some(TypeInfo::ClassStar)
860
+                    );
864861
                 if is_descriptor_arg {
865862
                     arg_attrs.push("descriptor");
866863
                 }
@@ -1059,8 +1056,12 @@ fn emit_type(out: &mut String, name: &str, type_layouts: &TypeLayoutRegistry) {
10591056
                     )
10601057
                     .unwrap();
10611058
                 } else {
1062
-                    writeln!(out, "  @binds {} => {}{}", bp.method_name, bp.target_name, abi_suffix)
1063
-                        .unwrap();
1059
+                    writeln!(
1060
+                        out,
1061
+                        "  @binds {} => {}{}",
1062
+                        bp.method_name, bp.target_name, abi_suffix
1063
+                    )
1064
+                    .unwrap();
10641065
                 }
10651066
             }
10661067
         }
@@ -1626,10 +1627,7 @@ fn parse_proc(header: &str, lines: &mut std::iter::Peekable<std::str::Lines>) ->
16261627
             i += 1;
16271628
         }
16281629
         match split_at {
1629
-            Some(idx) => (
1630
-                rest[..idx].trim_end(),
1631
-                rest[idx + 1..].trim_start(),
1632
-            ),
1630
+            Some(idx) => (rest[..idx].trim_end(), rest[idx + 1..].trim_start()),
16331631
             None => (rest.trim(), ""),
16341632
         }
16351633
     };
@@ -2141,11 +2139,7 @@ pub fn extract_optional_params(iface: &ModuleInterface) -> HashMap<String, Vec<b
21412139
             let key = proc.name.to_lowercase();
21422140
             out.insert(key.clone(), flags.clone());
21432141
             out.insert(
2144
-                format!(
2145
-                    "afs_modproc_{}_{}",
2146
-                    iface.module_name.to_lowercase(),
2147
-                    key
2148
-                ),
2142
+                format!("afs_modproc_{}_{}", iface.module_name.to_lowercase(), key),
21492143
                 flags,
21502144
             );
21512145
         }
@@ -2173,11 +2167,7 @@ pub fn extract_char_len_star_params(iface: &ModuleInterface) -> HashMap<String,
21732167
             let key = proc.name.to_lowercase();
21742168
             out.insert(key.clone(), flags.clone());
21752169
             out.insert(
2176
-                format!(
2177
-                    "afs_modproc_{}_{}",
2178
-                    iface.module_name.to_lowercase(),
2179
-                    key
2180
-                ),
2170
+                format!("afs_modproc_{}_{}", iface.module_name.to_lowercase(), key),
21812171
                 flags,
21822172
             );
21832173
         }
@@ -2197,11 +2187,7 @@ pub fn extract_descriptor_params(iface: &ModuleInterface) -> HashMap<String, Vec
21972187
             let key = proc.name.to_lowercase();
21982188
             out.insert(key.clone(), flags.clone());
21992189
             out.insert(
2200
-                format!(
2201
-                    "afs_modproc_{}_{}",
2202
-                    iface.module_name.to_lowercase(),
2203
-                    key
2204
-                ),
2190
+                format!("afs_modproc_{}_{}", iface.module_name.to_lowercase(), key),
22052191
                 flags,
22062192
             );
22072193
         }
src/sema/resolve.rsmodified
@@ -134,7 +134,11 @@ fn backfill_function_result_type(
134134
     let result_key = result_name.to_ascii_lowercase();
135135
     let (type_info, pointer, allocatable) = match st.scope(function_scope).symbols.get(&result_key)
136136
     {
137
-        Some(sym) => (sym.type_info.clone(), sym.attrs.pointer, sym.attrs.allocatable),
137
+        Some(sym) => (
138
+            sym.type_info.clone(),
139
+            sym.attrs.pointer,
140
+            sym.attrs.allocatable,
141
+        ),
138142
         None => return,
139143
     };
140144
     let Some(type_info) = type_info else {
@@ -554,16 +558,8 @@ fn resolve_unit(
554558
             // Surface each declared procedure to the enclosing scope
555559
             // so callers under IMPLICIT NONE can resolve the name,
556560
             // and so BIND(C) external prototypes are callable.
557
-            for (
558
-                fn_name,
559
-                kind,
560
-                ti,
561
-                arg_names,
562
-                binding_label,
563
-                pure,
564
-                elemental,
565
-                result_rank,
566
-            ) in outer_refs
561
+            for (fn_name, kind, ti, arg_names, binding_label, pure, elemental, result_rank) in
562
+                outer_refs
567563
             {
568564
                 let span = unit.span;
569565
                 let _ = st.define(Symbol {
@@ -1053,9 +1049,9 @@ fn load_external_module(
10531049
     // :: dummy` falls back to default kind=4 and silently truncates a
10541050
     // 64-bit local to 32 bits.
10551051
     for rename in &iface.renames {
1056
-        let src_scope = st
1057
-            .find_module_scope(&rename.source_module)
1058
-            .or_else(|| load_external_module(st, &rename.source_module, search_paths, type_layouts));
1052
+        let src_scope = st.find_module_scope(&rename.source_module).or_else(|| {
1053
+            load_external_module(st, &rename.source_module, search_paths, type_layouts)
1054
+        });
10591055
         let Some(src_scope) = src_scope else {
10601056
             continue;
10611057
         };
@@ -1224,9 +1220,7 @@ fn load_external_module(
12241220
         // and reject `allocate(result(...))`. Use a doubly-underscored
12251221
         // synth name so SMP-body synthesis can find it (via the body
12261222
         // scope after sema injection) but no user code can collide.
1227
-        if matches!(proc.kind, crate::sema::symtab::SymbolKind::Function)
1228
-            && proc.result_rank > 0
1229
-        {
1223
+        if matches!(proc.kind, crate::sema::symtab::SymbolKind::Function) && proc.result_rank > 0 {
12301224
             let synth_name = format!(
12311225
                 "__amod_result_{}",
12321226
                 proc.result_name.as_deref().unwrap_or(&proc.name)
@@ -1432,10 +1426,13 @@ fn inject_separate_module_procedure_args(
14321426
     let proc_lc = proc_name.to_lowercase();
14331427
     let iface_scope = st.all_scopes().iter().find_map(|scope| {
14341428
         let direct_parent_matches = scope.parent == Some(parent_module_scope);
1435
-        let via_interface = scope.parent.map(|pid| {
1436
-            matches!(st.scope(pid).kind, ScopeKind::Interface)
1437
-                && st.scope(pid).parent == Some(parent_module_scope)
1438
-        }).unwrap_or(false);
1429
+        let via_interface = scope
1430
+            .parent
1431
+            .map(|pid| {
1432
+                matches!(st.scope(pid).kind, ScopeKind::Interface)
1433
+                    && st.scope(pid).parent == Some(parent_module_scope)
1434
+            })
1435
+            .unwrap_or(false);
14391436
         if !direct_parent_matches && !via_interface {
14401437
             return None;
14411438
         }
@@ -1458,17 +1455,13 @@ fn inject_separate_module_procedure_args(
14581455
     let arg_symbols: Vec<Symbol> = arg_order
14591456
         .iter()
14601457
         .filter_map(|n| {
1461
-            st.scope(iface_scope)
1462
-                .symbols
1463
-                .get(n)
1464
-                .cloned()
1465
-                .or_else(|| {
1466
-                    st.scope(iface_scope)
1467
-                        .symbols
1468
-                        .iter()
1469
-                        .find(|(_, s)| s.name.eq_ignore_ascii_case(n))
1470
-                        .map(|(_, s)| s.clone())
1471
-                })
1458
+            st.scope(iface_scope).symbols.get(n).cloned().or_else(|| {
1459
+                st.scope(iface_scope)
1460
+                    .symbols
1461
+                    .iter()
1462
+                    .find(|(_, s)| s.name.eq_ignore_ascii_case(n))
1463
+                    .map(|(_, s)| s.clone())
1464
+            })
14721465
         })
14731466
         .collect();
14741467
 
@@ -1964,10 +1957,7 @@ fn collect_const_derived_field_inits(
19641957
                     }
19651958
                 }
19661959
                 for (field_name, field_init) in overrides {
1967
-                    combined.insert(
1968
-                        field_name.to_ascii_lowercase(),
1969
-                        (field_name, field_init),
1970
-                    );
1960
+                    combined.insert(field_name.to_ascii_lowercase(), (field_name, field_init));
19711961
                 }
19721962
 
19731963
                 for (_field_key, (field_name, field_init)) in combined {
@@ -2088,11 +2078,7 @@ fn resolve_proc_pointer_default_targets(
20882078
 /// unmodified.  USE associations are followed transitively so renames
20892079
 /// like `default_hasher => fnv_1_hasher` resolve to the underlying
20902080
 /// procedure's origin module.
2091
-fn resolve_proc_pointer_link_symbol(
2092
-    st: &SymbolTable,
2093
-    from_scope: ScopeId,
2094
-    target: &str,
2095
-) -> String {
2081
+fn resolve_proc_pointer_link_symbol(st: &SymbolTable, from_scope: ScopeId, target: &str) -> String {
20962082
     let key = target.to_lowercase();
20972083
     let mut seen = std::collections::HashSet::new();
20982084
     let mut current_scope = from_scope;
@@ -2372,7 +2358,8 @@ fn process_contains(
23722358
 ) -> Result<(), SemaError> {
23732359
     for unit in contains {
23742360
         // Register the subprogram name in the current scope before descending.
2375
-        let host_is_submodule = matches!(st.scope(st.current_scope()).kind, ScopeKind::Submodule(_));
2361
+        let host_is_submodule =
2362
+            matches!(st.scope(st.current_scope()).kind, ScopeKind::Submodule(_));
23762363
         match &unit.node {
23772364
             ProgramUnit::Subroutine {
23782365
                 name, prefix, bind, ..
@@ -2616,23 +2603,23 @@ fn eval_const_int_expr(expr: &crate::ast::expr::SpannedExpr, st: &SymbolTable) -
26162603
                             _ => None,
26172604
                         }?;
26182605
                         match ty {
2619
-                            TypeInfo::Integer { kind } => Some(match kind
2620
-                                .unwrap_or(crate::driver::defaults::default_int_kind())
2621
-                            {
2622
-                                1 => 2,
2623
-                                2 => 4,
2624
-                                4 => 9,
2625
-                                8 => 18,
2626
-                                16 => 38,
2627
-                                _ => return None,
2628
-                            }),
2629
-                            TypeInfo::Real { kind } => Some(match kind
2630
-                                .unwrap_or(crate::driver::defaults::default_real_kind())
2631
-                            {
2632
-                                4 => 37,
2633
-                                8 => 307,
2634
-                                _ => return None,
2635
-                            }),
2606
+                            TypeInfo::Integer { kind } => Some(
2607
+                                match kind.unwrap_or(crate::driver::defaults::default_int_kind()) {
2608
+                                    1 => 2,
2609
+                                    2 => 4,
2610
+                                    4 => 9,
2611
+                                    8 => 18,
2612
+                                    16 => 38,
2613
+                                    _ => return None,
2614
+                                },
2615
+                            ),
2616
+                            TypeInfo::Real { kind } => Some(
2617
+                                match kind.unwrap_or(crate::driver::defaults::default_real_kind()) {
2618
+                                    4 => 37,
2619
+                                    8 => 307,
2620
+                                    _ => return None,
2621
+                                },
2622
+                            ),
26362623
                             TypeInfo::DoublePrecision => Some(307),
26372624
                             _ => None,
26382625
                         }
@@ -2672,10 +2659,7 @@ fn extract_kind(sel: &Option<decl::KindSelector>, st: &SymbolTable) -> Option<u8
26722659
 /// string literals, references to other character parameters whose
26732660
 /// length is already known, and `lit // lit` / `lit // name` concat
26742661
 /// chains.  Returns None when we can't classify the init.
2675
-fn derived_char_init_len(
2676
-    e: &crate::ast::expr::Expr,
2677
-    st: &SymbolTable,
2678
-) -> Option<usize> {
2662
+fn derived_char_init_len(e: &crate::ast::expr::Expr, st: &SymbolTable) -> Option<usize> {
26792663
     use crate::ast::expr::Expr;
26802664
     match e {
26812665
         Expr::StringLiteral { value, .. } => Some(value.len()),
@@ -2692,8 +2676,7 @@ fn derived_char_init_len(
26922676
             op: crate::ast::expr::BinaryOp::Concat,
26932677
             left,
26942678
             right,
2695
-        } => Some(derived_char_init_len(&left.node, st)?
2696
-            + derived_char_init_len(&right.node, st)?),
2679
+        } => Some(derived_char_init_len(&left.node, st)? + derived_char_init_len(&right.node, st)?),
26972680
         _ => None,
26982681
     }
26992682
 }
src/sema/symtab.rsmodified
@@ -78,9 +78,9 @@ impl SymbolTable {
7878
             // procedure (Subroutine/Function/Program). Stop walking
7979
             // when we leave a procedure scope.
8080
             match self.scopes[sid].kind {
81
-                ScopeKind::Subroutine(_)
82
-                | ScopeKind::Function(_)
83
-                | ScopeKind::Program(_) => return None,
81
+                ScopeKind::Subroutine(_) | ScopeKind::Function(_) | ScopeKind::Program(_) => {
82
+                    return None
83
+                }
8484
                 _ => cur = self.scopes[sid].parent,
8585
             }
8686
         }
@@ -350,9 +350,7 @@ impl SymbolTable {
350350
                     {
351351
                         return Some(sym);
352352
                     }
353
-                    if let Some(sym) =
354
-                        self.lookup_in(assoc.source_scope, &assoc.original_name)
355
-                    {
353
+                    if let Some(sym) = self.lookup_in(assoc.source_scope, &assoc.original_name) {
356354
                         return Some(sym);
357355
                     }
358356
                 }
src/sema/type_layout.rsmodified
@@ -121,7 +121,11 @@ fn stable_type_tag(layout: &TypeLayout) -> u64 {
121121
         hash ^= byte as u64;
122122
         hash = hash.wrapping_mul(0x100000001b3);
123123
     }
124
-    if hash == 0 { 1 } else { hash }
124
+    if hash == 0 {
125
+        1
126
+    } else {
127
+        hash
128
+    }
125129
 }
126130
 
127131
 impl TypeLayoutRegistry {
@@ -318,7 +322,8 @@ fn eval_const_field_int_expr(
318322
             eval_const_field_int_expr(inner, const_params, const_derived_field_inits)
319323
         }
320324
         Expr::UnaryOp { op, operand } => {
321
-            let value = eval_const_field_int_expr(operand, const_params, const_derived_field_inits)?;
325
+            let value =
326
+                eval_const_field_int_expr(operand, const_params, const_derived_field_inits)?;
322327
             match op {
323328
                 crate::ast::expr::UnaryOp::Minus => Some(-value),
324329
                 crate::ast::expr::UnaryOp::Plus => Some(value),
@@ -355,7 +360,9 @@ fn eval_const_field_logical_expr(
355360
                 _ => None,
356361
             }
357362
         }
358
-        Expr::ParenExpr { inner } => eval_const_field_logical_expr(inner, const_derived_field_inits),
363
+        Expr::ParenExpr { inner } => {
364
+            eval_const_field_logical_expr(inner, const_derived_field_inits)
365
+        }
359366
         Expr::UnaryOp {
360367
             op: crate::ast::expr::UnaryOp::Not,
361368
             operand,
@@ -390,7 +397,8 @@ fn eval_const_field_char_expr(
390397
             left,
391398
             right,
392399
         } => {
393
-            let mut out = eval_const_field_char_expr(left, const_params, const_derived_field_inits)?;
400
+            let mut out =
401
+                eval_const_field_char_expr(left, const_params, const_derived_field_inits)?;
394402
             out.push_str(&eval_const_field_char_expr(
395403
                 right,
396404
                 const_params,
@@ -411,8 +419,11 @@ fn eval_const_field_char_expr(
411419
                             None
412420
                         }
413421
                     })?;
414
-                    let code =
415
-                        eval_const_field_int_expr(first_arg, const_params, const_derived_field_inits)?;
422
+                    let code = eval_const_field_int_expr(
423
+                        first_arg,
424
+                        const_params,
425
+                        const_derived_field_inits,
426
+                    )?;
416427
                     if !(0..=255).contains(&code) {
417428
                         return None;
418429
                     }
@@ -422,13 +433,21 @@ fn eval_const_field_char_expr(
422433
                 "repeat" if args.len() == 2 => {
423434
                     let pattern = match &args[0].value {
424435
                         crate::ast::expr::SectionSubscript::Element(expr) => {
425
-                            eval_const_field_char_expr(expr, const_params, const_derived_field_inits)?
436
+                            eval_const_field_char_expr(
437
+                                expr,
438
+                                const_params,
439
+                                const_derived_field_inits,
440
+                            )?
426441
                         }
427442
                         _ => return None,
428443
                     };
429444
                     let copies = match &args[1].value {
430445
                         crate::ast::expr::SectionSubscript::Element(expr) => {
431
-                            eval_const_field_int_expr(expr, const_params, const_derived_field_inits)?
446
+                            eval_const_field_int_expr(
447
+                                expr,
448
+                                const_params,
449
+                                const_derived_field_inits,
450
+                            )?
432451
                         }
433452
                         _ => return None,
434453
                     };
@@ -452,17 +471,16 @@ pub fn eval_const_field_default_init_for_layout(
452471
     const_derived_field_inits: &HashMap<String, FieldDefaultInit>,
453472
 ) -> Option<FieldDefaultInit> {
454473
     match type_info {
455
-        TypeInfo::Character { .. } => eval_const_field_char_expr(
456
-            expr,
457
-            const_params,
458
-            const_derived_field_inits,
459
-        )
460
-        .map(FieldDefaultInit::Character),
461
-        TypeInfo::Integer { .. } => eval_const_field_int_expr(expr, const_params, const_derived_field_inits)
462
-            .map(|value| FieldDefaultInit::Integer(value as i128)),
463
-        TypeInfo::Logical { .. } => {
464
-            eval_const_field_logical_expr(expr, const_derived_field_inits).map(FieldDefaultInit::Logical)
474
+        TypeInfo::Character { .. } => {
475
+            eval_const_field_char_expr(expr, const_params, const_derived_field_inits)
476
+                .map(FieldDefaultInit::Character)
477
+        }
478
+        TypeInfo::Integer { .. } => {
479
+            eval_const_field_int_expr(expr, const_params, const_derived_field_inits)
480
+                .map(|value| FieldDefaultInit::Integer(value as i128))
465481
         }
482
+        TypeInfo::Logical { .. } => eval_const_field_logical_expr(expr, const_derived_field_inits)
483
+            .map(FieldDefaultInit::Logical),
466484
         TypeInfo::Derived(type_name) | TypeInfo::Class(type_name) => {
467485
             eval_const_derived_default_init(
468486
                 type_name,
@@ -698,13 +716,10 @@ pub fn compute_layout_with_attrs(
698716
                         && !declared_array
699717
                     {
700718
                         (32, 8) // StringDescriptor for deferred-length scalar char components
701
-                } else if is_pointer
702
-                    && !declared_array
703
-                    && !matches!(ti, TypeInfo::Class(_))
704
-                {
705
-                    (8, 8) // Scalar POINTER components are pointer slots, not descriptors
706
-                } else if is_allocatable || is_pointer {
707
-                    (384, 8) // ArrayDescriptor size for allocatable/pointer array components
719
+                    } else if is_pointer && !declared_array && !matches!(ti, TypeInfo::Class(_)) {
720
+                        (8, 8) // Scalar POINTER components are pointer slots, not descriptors
721
+                    } else if is_allocatable || is_pointer {
722
+                        (384, 8) // ArrayDescriptor size for allocatable/pointer array components
708723
                     } else if let TypeInfo::Derived(ref dname) = ti {
709724
                         registry
710725
                             .get(dname)
@@ -803,11 +818,7 @@ pub fn compute_layout_with_attrs(
803818
         // looked up `_afs_modproc_<mod>_process_get_id` — caught at
804819
         // stdlib `example_process_5` link.
805820
         if let Some(module_name) = host_module {
806
-            format!(
807
-                "afs_modproc_{}_{}",
808
-                module_name.to_lowercase(),
809
-                target
810
-            )
821
+            format!("afs_modproc_{}_{}", module_name.to_lowercase(), target)
811822
         } else {
812823
             target.to_string()
813824
         }
src/sema/types.rsmodified
@@ -657,9 +657,7 @@ pub fn expr_type(
657657
             let base_ty = expr_type(base, symtab);
658658
             let lc = component.to_lowercase();
659659
             match (lc.as_str(), &base_ty) {
660
-                ("re" | "im", FortranType::Complex { kind }) => {
661
-                    FortranType::Real { kind: *kind }
662
-                }
660
+                ("re" | "im", FortranType::Complex { kind }) => FortranType::Real { kind: *kind },
663661
                 _ => FortranType::Unknown,
664662
             }
665663
         }
@@ -1069,10 +1067,7 @@ pub fn intrinsic_result_type(name: &str, args: &[FortranType]) -> Option<Fortran
10691067
         // `lower_rank1_elemental_call_descriptor` can't compute the mask
10701068
         // result element type and bails to the rank-1-only scalarization
10711069
         // path (which corrupts rank-N callers).
1072
-        "ieee_is_nan"
1073
-        | "ieee_is_finite"
1074
-        | "ieee_is_negative"
1075
-        | "ieee_is_normal"
1070
+        "ieee_is_nan" | "ieee_is_finite" | "ieee_is_negative" | "ieee_is_normal"
10761071
         | "ieee_signbit" => Some(FortranType::default_logical()),
10771072
         "ieee_value" => args.first().cloned(),
10781073
 
tests/cli_driver.rsmodified
@@ -9215,7 +9215,11 @@ fn generic_subroutine_accepts_imported_derived_array_element_actual() {
92159215
     let main_obj = dir.join("main.o");
92169216
     let out = dir.join("generic_imported_derived_array_elem");
92179217
 
9218
-    for (src, obj) in [(&types_src, &types_obj), (&impl_src, &impl_obj), (&main_src, &main_obj)] {
9218
+    for (src, obj) in [
9219
+        (&types_src, &types_obj),
9220
+        (&impl_src, &impl_obj),
9221
+        (&main_src, &main_obj),
9222
+    ] {
92199223
         let compile = Command::new(compiler("armfortas"))
92209224
             .current_dir(&dir)
92219225
             .args([
@@ -10757,9 +10761,7 @@ fn matmul_over_integer_matrices_uses_column_major_indexing() {
1075710761
         "matmul int should compile: {}",
1075810762
         String::from_utf8_lossy(&compile.stderr)
1075910763
     );
10760
-    let run = Command::new(&out)
10761
-        .output()
10762
-        .expect("matmul int run failed");
10764
+    let run = Command::new(&out).output().expect("matmul int run failed");
1076310765
     assert!(
1076410766
         run.status.success(),
1076510767
         "matmul int should pass: status={:?} stdout={} stderr={}",
@@ -10838,7 +10840,9 @@ fn matmul_over_complex_kind4_matrices_produces_correct_results() {
1083810840
         "matmul complex4 should compile: {}",
1083910841
         String::from_utf8_lossy(&compile.stderr)
1084010842
     );
10841
-    let run = Command::new(&out).output().expect("matmul complex4 run failed");
10843
+    let run = Command::new(&out)
10844
+        .output()
10845
+        .expect("matmul complex4 run failed");
1084210846
     assert!(
1084310847
         run.status.success(),
1084410848
         "matmul complex4 should pass: status={:?} stdout={} stderr={}",
@@ -10873,7 +10877,9 @@ fn matmul_over_complex_kind8_matrices_produces_correct_imag_part() {
1087310877
         "matmul complex8 should compile: {}",
1087410878
         String::from_utf8_lossy(&compile.stderr)
1087510879
     );
10876
-    let run = Command::new(&out).output().expect("matmul complex8 run failed");
10880
+    let run = Command::new(&out)
10881
+        .output()
10882
+        .expect("matmul complex8 run failed");
1087710883
     assert!(
1087810884
         run.status.success(),
1087910885
         "matmul complex8 should pass: status={:?} stdout={} stderr={}",
@@ -10931,7 +10937,9 @@ fn inline_array_intrinsic_in_print_handles_complex_elements() {
1093110937
         stdout
1093210938
     );
1093310939
     assert!(
10934
-        stdout.contains(",   0.0000000E0)") || stdout.contains(",0.0000000E+0)") || stdout.contains(",   0.0000000E+0)"),
10940
+        stdout.contains(",   0.0000000E0)")
10941
+            || stdout.contains(",0.0000000E+0)")
10942
+            || stdout.contains(",   0.0000000E+0)"),
1093510943
         "complex closing paren missing: {}",
1093610944
         stdout
1093710945
     );
@@ -11714,8 +11722,16 @@ fn class_star_optional_argument_forwards_through_intermediate_subroutine() {
1171411722
         String::from_utf8_lossy(&run.stderr)
1171511723
     );
1171611724
     let stdout = String::from_utf8_lossy(&run.stdout);
11717
-    assert!(stdout.contains("A"), "expected absent path to print A: {}", stdout);
11718
-    assert!(stdout.contains("P"), "expected present path to print P: {}", stdout);
11725
+    assert!(
11726
+        stdout.contains("A"),
11727
+        "expected absent path to print A: {}",
11728
+        stdout
11729
+    );
11730
+    assert!(
11731
+        stdout.contains("P"),
11732
+        "expected present path to print P: {}",
11733
+        stdout
11734
+    );
1171911735
 
1172011736
     let _ = std::fs::remove_file(&out);
1172111737
     let _ = std::fs::remove_file(&src);
@@ -11868,7 +11884,10 @@ fn assumed_shape_lower_bound_override_rebases_dummy_descriptor() {
1186811884
     );
1186911885
     let stdout = String::from_utf8_lossy(&run.stdout);
1187011886
     assert!(
11871
-        stdout.contains("sorted=") && stdout.contains("1") && stdout.contains("2") && stdout.contains("3"),
11887
+        stdout.contains("sorted=")
11888
+            && stdout.contains("1")
11889
+            && stdout.contains("2")
11890
+            && stdout.contains("3"),
1187211891
         "expected sorted output: {}",
1187311892
         stdout
1187411893
     );
@@ -12718,14 +12737,23 @@ fn inline_array_intrinsic_in_print_walks_descriptor_elements() {
1271812737
     );
1271912738
     let stdout = String::from_utf8_lossy(&run.stdout);
1272012739
     // transpose([1..9, [3,3]]) = [1,4,7,2,5,8,3,6,9] in column-major
12721
-    assert!(stdout.contains("1") && stdout.contains("4") && stdout.contains("7"),
12722
-        "transpose row missing: {}", stdout);
12740
+    assert!(
12741
+        stdout.contains("1") && stdout.contains("4") && stdout.contains("7"),
12742
+        "transpose row missing: {}",
12743
+        stdout
12744
+    );
1272312745
     // matmul self-product diagonal: B(1,1)=30
12724
-    assert!(stdout.contains("30") && stdout.contains("81") && stdout.contains("150"),
12725
-        "matmul values missing: {}", stdout);
12746
+    assert!(
12747
+        stdout.contains("30") && stdout.contains("81") && stdout.contains("150"),
12748
+        "matmul values missing: {}",
12749
+        stdout
12750
+    );
1272612751
     // shape: "3 3"
12727
-    assert!(stdout.lines().any(|l| l.split_whitespace().eq(["3", "3"])),
12728
-        "shape line missing: {}", stdout);
12752
+    assert!(
12753
+        stdout.lines().any(|l| l.split_whitespace().eq(["3", "3"])),
12754
+        "shape line missing: {}",
12755
+        stdout
12756
+    );
1272912757
 
1273012758
     let _ = std::fs::remove_file(&out);
1273112759
     let _ = std::fs::remove_file(&src);
@@ -13102,7 +13130,9 @@ fn module_parameter_array_scalar_broadcast_init_keeps_array_global() {
1310213130
         "scalar broadcast should compile + link: {}",
1310313131
         String::from_utf8_lossy(&compile.stderr)
1310413132
     );
13105
-    let run = Command::new(&out).output().expect("scalar broadcast run failed");
13133
+    let run = Command::new(&out)
13134
+        .output()
13135
+        .expect("scalar broadcast run failed");
1310613136
     assert!(
1310713137
         run.status.success(),
1310813138
         "scalar broadcast should pass: status={:?} stdout={} stderr={}",
@@ -13149,7 +13179,9 @@ fn internal_subprogram_call_under_intrinsic_under_user_call_keeps_mangled_name()
1314913179
         "should compile + link cleanly: {}",
1315013180
         String::from_utf8_lossy(&compile.stderr)
1315113181
     );
13152
-    let run = Command::new(&out).output().expect("internal mangle run failed");
13182
+    let run = Command::new(&out)
13183
+        .output()
13184
+        .expect("internal mangle run failed");
1315313185
     assert!(
1315413186
         run.status.success(),
1315513187
         "should pass: status={:?} stdout={} stderr={}",
@@ -18243,7 +18275,10 @@ fn sibling_extensions_keep_distinct_runtime_tags_across_tus() {
1824318275
         (&main_src, &main_obj, "main program", true),
1824418276
     ] {
1824518277
         let mut cmd = Command::new(compiler("armfortas"));
18246
-        cmd.current_dir(&dir).arg("-c").arg("-J").arg(dir.to_str().unwrap());
18278
+        cmd.current_dir(&dir)
18279
+            .arg("-c")
18280
+            .arg("-J")
18281
+            .arg(dir.to_str().unwrap());
1824718282
         if needs_imports {
1824818283
             cmd.arg("-I").arg(dir.to_str().unwrap());
1824918284
         }
@@ -21040,7 +21075,8 @@ fn logical_reduction_intrinsics_on_component_char_constructor_actuals_compile_an
2104021075
 }
2104121076
 
2104221077
 #[test]
21043
-fn logical_reduction_intrinsics_on_nonmatching_component_char_constructor_actuals_compile_and_run() {
21078
+fn logical_reduction_intrinsics_on_nonmatching_component_char_constructor_actuals_compile_and_run()
21079
+{
2104421080
     let src = write_program(
2104521081
         "program p\n  implicit none\n  type :: chars_t\n    character(len=1) :: equal\n    character(len=1) :: space\n    character(len=1) :: tab\n  end type\n  type(chars_t), parameter :: char_kind = chars_t('=', ' ', achar(9))\n\n  if (any(match(char_kind%equal, 1, [char_kind%space, char_kind%tab]))) error stop 1\n\n  print *, 'ok'\ncontains\n  elemental logical function match(src, idx, want) result(ok)\n    character(len=*), intent(in) :: src\n    integer, intent(in) :: idx\n    character(len=1), intent(in) :: want\n    ok = src(idx:idx) == want\n  end function\nend program\n",
2104621082
         "f90",
@@ -24547,7 +24583,10 @@ fn module_global_component_overloaded_concat_preserves_nested_character_actual_l
2454724583
         "module m\n  implicit none\n  integer, parameter :: i1 = selected_int_kind(2)\n  type :: color_code\n    integer(i1) :: style = -1_i1\n    integer(i1) :: bg = -1_i1\n    integer(i1) :: fg = -1_i1\n  end type\n  type :: color_output\n    type(color_code) :: dim = color_code(style=2_i1)\n    type(color_code) :: reset = color_code()\n    type(color_code) :: blue = color_code(fg=4_i1)\n  end type\n  type(color_output), protected :: color\n  interface operator(//)\n    module procedure :: concat_color_left\n    module procedure :: concat_color_right\n  end interface\ncontains\n  pure function concat_color_left(lval, code) result(str)\n    character(len=*), intent(in) :: lval\n    type(color_code), intent(in) :: code\n    character(len=:), allocatable :: str\n    if (anycolor(code)) then\n      str = lval // 'X'\n    else\n      str = lval // 'Y'\n    end if\n  end function\n  pure function concat_color_right(code, rval) result(str)\n    type(color_code), intent(in) :: code\n    character(len=*), intent(in) :: rval\n    character(len=:), allocatable :: str\n    if (anycolor(code)) then\n      str = 'Z' // rval\n    else\n      str = 'W' // rval\n    end if\n  end function\n  pure function anycolor(code) result(flag)\n    type(color_code), intent(in) :: code\n    logical :: flag\n    flag = code%fg >= 0 .or. code%bg >= 0 .or. code%style >= 0\n  end function\nend module\nprogram p\n  use m\n  implicit none\n  character(len=:), allocatable :: s\n  s = 'A' // color%dim // 'B' // color%reset // 'C' // color%blue\n  if (s /= 'AXBYCX') error stop 1\n  print *, 'ok'\nend program\n",
2454824584
         "f90",
2454924585
     );
24550
-    let out = unique_path("module_global_component_overloaded_concat_nested_len", "bin");
24586
+    let out = unique_path(
24587
+        "module_global_component_overloaded_concat_nested_len",
24588
+        "bin",
24589
+    );
2455124590
     let compile = Command::new(compiler("armfortas"))
2455224591
         .args([src.to_str().unwrap(), "-o", out.to_str().unwrap()])
2455324592
         .output()
@@ -25532,7 +25571,9 @@ fn complex_re_im_designators_lower_to_correct_lane_and_dispatch_real_kind() {
2553225571
         "complex %re dispatch compile failed: {}",
2553325572
         String::from_utf8_lossy(&compile.stderr)
2553425573
     );
25535
-    let run = Command::new(&out).output().expect("complex %re dispatch run failed");
25574
+    let run = Command::new(&out)
25575
+        .output()
25576
+        .expect("complex %re dispatch run failed");
2553625577
     assert!(
2553725578
         run.status.success() && String::from_utf8_lossy(&run.stdout).contains("ok"),
2553825579
         "complex %re dispatch run failed: status={:?} stdout={} stderr={}",
@@ -25618,7 +25659,15 @@ fn f2008_submodule_explicit_iface_smp_body_split_file_runtime_shape_result() {
2561825659
         String::from_utf8_lossy(&run.stderr)
2561925660
     );
2562025661
 
25621
-    for p in [&parent_src, &sub_src, &main_src, &parent_o, &sub_o, &main_o, &out] {
25662
+    for p in [
25663
+        &parent_src,
25664
+        &sub_src,
25665
+        &main_src,
25666
+        &parent_o,
25667
+        &sub_o,
25668
+        &main_o,
25669
+        &out,
25670
+    ] {
2562225671
         let _ = std::fs::remove_file(p);
2562325672
     }
2562425673
     let _ = std::fs::remove_dir_all(&mod_dir);
@@ -26207,7 +26256,9 @@ fn nested_call_chain_with_array_section_args_keeps_frame_bounded() {
2620726256
     // Pre-fix: ~958. Post-fix: well under 50 for this shape.
2620826257
     let probes_to_next_label = asm_text[outer_start..]
2620926258
         .lines()
26210
-        .take_while(|line| !line.trim_start().starts_with("_afs_modproc_") || line.contains("water_simple:"))
26259
+        .take_while(|line| {
26260
+            !line.trim_start().starts_with("_afs_modproc_") || line.contains("water_simple:")
26261
+        })
2621126262
         .filter(|line| line.contains("movz x16, #16384"))
2621226263
         .count();
2621326264
     assert!(
@@ -26216,7 +26267,9 @@ fn nested_call_chain_with_array_section_args_keeps_frame_bounded() {
2621626267
          The fix in array_function_result_elem_type may have regressed.",
2621726268
         probes_to_next_label
2621826269
     );
26219
-    let run = Command::new(&out).output().expect("water-hash-frame run failed");
26270
+    let run = Command::new(&out)
26271
+        .output()
26272
+        .expect("water-hash-frame run failed");
2622026273
     assert!(
2622126274
         run.status.success(),
2622226275
         "water-hash-frame run failed: status={:?} stdout={} stderr={}",
@@ -26549,7 +26602,9 @@ fn defined_assignment_class_lhs_loads_descriptor_pointer_through_slot() {
2654926602
         "class assign compile failed: {}",
2655026603
         String::from_utf8_lossy(&compile.stderr)
2655126604
     );
26552
-    let run = Command::new(&out).output().expect("class assign run failed");
26605
+    let run = Command::new(&out)
26606
+        .output()
26607
+        .expect("class assign run failed");
2655326608
     assert!(
2655426609
         run.status.success() && String::from_utf8_lossy(&run.stdout).contains("ok"),
2655526610
         "class assign run failed: status={:?} stdout={} stderr={}",
@@ -26682,7 +26737,15 @@ fn amod_proc_attrs_split_preserves_result_array_bounds_with_inner_comma() {
2668226737
         String::from_utf8_lossy(&run.stderr)
2668326738
     );
2668426739
 
26685
-    for p in [&parent_src, &sub_src, &main_src, &parent_o, &sub_o, &main_o, &out] {
26740
+    for p in [
26741
+        &parent_src,
26742
+        &sub_src,
26743
+        &main_src,
26744
+        &parent_o,
26745
+        &sub_o,
26746
+        &main_o,
26747
+        &out,
26748
+    ] {
2668626749
         let _ = std::fs::remove_file(p);
2668726750
     }
2668826751
     let _ = std::fs::remove_dir_all(&mod_dir);
@@ -26715,7 +26778,9 @@ fn cmplx_whole_array_with_kind_keyword_returns_correct_kind_descriptor() {
2671526778
         "cmplx whole-array compile failed: {}",
2671626779
         String::from_utf8_lossy(&compile.stderr)
2671726780
     );
26718
-    let run = Command::new(&out).output().expect("cmplx whole-array run failed");
26781
+    let run = Command::new(&out)
26782
+        .output()
26783
+        .expect("cmplx whole-array run failed");
2671926784
     assert!(
2672026785
         run.status.success() && String::from_utf8_lossy(&run.stdout).contains("ok"),
2672126786
         "cmplx whole-array run failed: status={:?} stdout={} stderr={}",
tests/run_programs.rsmodified
@@ -1541,8 +1541,13 @@ fn compile_stage_bytes(
15411541
     opt_flag: &str,
15421542
     stage: ReproStage,
15431543
 ) -> Result<Vec<u8>, String> {
1544
-    let source_path = fs::canonicalize(source)
1545
-        .map_err(|e| format!("{}: cannot canonicalize source path: {}", source.display(), e))?;
1544
+    let source_path = fs::canonicalize(source).map_err(|e| {
1545
+        format!(
1546
+            "{}: cannot canonicalize source path: {}",
1547
+            source.display(),
1548
+            e
1549
+        )
1550
+    })?;
15461551
     let stem = source.file_stem().unwrap().to_str().unwrap();
15471552
     let level = opt_flag.trim_start_matches('-');
15481553
     let (kind, ext, extra_args): (&str, &str, &[&str]) = match stage {
@@ -1554,7 +1559,8 @@ fn compile_stage_bytes(
15541559
         }
15551560
     };
15561561
     let out = unique_temp_path(kind, stem, level, ext);
1557
-    let compile_sandbox = unique_temp_path("compile_sandbox", stem, &format!("{}_{}", level, kind), "");
1562
+    let compile_sandbox =
1563
+        unique_temp_path("compile_sandbox", stem, &format!("{}_{}", level, kind), "");
15581564
     fs::create_dir_all(&compile_sandbox).map_err(|e| {
15591565
         format!(
15601566
             "{}: cannot create {} compile sandbox {}: {}",