{"record":{"id":"ee84a4d88792431d","repo":"embassy-rs/embassy","slug":"cursed-bit-offset","errorCode":null,"errorMessage":"cursed bit offset","messagePattern":"cursed bit offset","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"embassy-stm32/build.rs","lineNumber":918,"sourceCode":"                    .iter()\n                    .find(|i| i.name.eq_ignore_ascii_case(reg.register))\n                    .unwrap()\n                    .byte_offset;\n                let reg_offset: u8 = (reg_offset / 4).try_into().unwrap();\n\n                let bit_offset = &rcc_registers\n                    .ir\n                    .fieldsets\n                    .iter()\n                    .find(|i| i.name.eq_ignore_ascii_case(reg.register))\n                    .unwrap()\n                    .fields\n                    .iter()\n                    .find(|i| i.name.eq_ignore_ascii_case(reg.field))\n                    .unwrap()\n                    .bit_offset;\n                let BitOffset::Regular(bit_offset) = bit_offset else {\n                    panic!(\"cursed bit offset\")\n                };\n                let bit_offset: u8 = bit_offset.offset.try_into().unwrap();\n\n                quote! { (#reg_offset, #bit_offset) }\n            };\n\n            let reset_offset_and_bit = match rst_reg {\n                Some(rst_reg) => {\n                    let reset_offset_and_bit = get_offset_and_bit(rst_reg);\n                    quote! { Some(#reset_offset_and_bit) }\n                }\n                None => quote! { None },\n            };\n            let enable_offset_and_bit = get_offset_and_bit(en_reg);\n\n            let needs_refcount = *rcc_field_count.get(&(en_reg.register, en_reg.field)).unwrap() > 1;\n            let refcount_idx = if needs_refcount {\n                let refcount_idx = format_ident!(\"{}_{}\", en_reg.register, en_reg.field);","sourceCodeStart":900,"sourceCodeEnd":936,"githubUrl":"https://github.com/embassy-rs/embassy/blob/463a07b963419a1bfe61d5d597c44acb810afb8b/embassy-stm32/build.rs#L900-L936","documentation":"In build.rs's RCC register-block generation, the script extracts a register field's bit offset from the chip metadata and expects a `BitOffset::Regular` variant. When the field metadata uses another bit-offset representation (e.g. enumerated/split ranges), the script panics with \"cursed bit offset\". It signals unsupported/odd field layout in the generated chip metadata, not a user mistake.","triggerScenarios":"Generating RCC code for a chip whose metadata describes a mux/register field with a non-regular bit offset (BitOffset::Enumerated or similar), e.g. unusual or newly-added STM32 parts with odd field layouts.","commonSituations":"Adding support for a new STM32 family whose SVD/metadata encodes fields differently; corrupted or hand-edited generated metadata.","solutions":["Check embassy-stm32's generated metadata for the offending register/field and normalize it to a regular bit offset.","Extend build.rs to handle the alternative BitOffset variant if the field genuinely is non-contiguous.","Update or regenerate the chip metadata from a newer SVD/chip definition."],"exampleFix":"// before (build.rs)\nlet BitOffset::Regular(bit_offset) = bit_offset else { panic!(\"cursed bit offset\") };\n// after (handle enumerated fields explicitly)\nlet offset = match bit_offset {\n    BitOffset::Regular(o) => o.offset,\n    BitOffset::Enumerated { offset, .. } => offset,\n};","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"// build script panic — no runtime catch; fix metadata or extend BitOffset handling\nlet offset = match bit_offset {\n    BitOffset::Regular(o) => o.offset,\n    BitOffset::Enumerated { offset, .. } => offset,\n};","preventionTips":["Keep chip metadata in sync with the embassy-stm32 version you build against.","When adding new chips, inspect field bit-offset encodings for anomalies.","Pin metadata generation to the version the build script expects."],"tags":["build-script","bitfield","metadata","stm32"],"backgroundTag":"internal-invariant-violation","analyzedSha":"463a07b963419a1bfe61d5d597c44acb810afb8b","analyzedAt":"2026-09-10T13:38:26.660Z","contentChangedAt":"2026-09-10T13:38:26.660Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}