rust-lang / rust-lang/rustfmt

[ICE]: bad span: `)`: ` `; `cfg_select!` invalid arm expr "successfully" formats but produces an ICE report

Open
#7,087 3 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

A-cfg_select A-test-harness C-bug I-ICE
Dominant language
Rust
Stars
7k
Forks
1.1k
Avg merge
2d 13h
Merged PRs (30d)
24

Description

Code

#![crate_type = "lib"]

    cfg_select! {
        true => {
            fn foo{
    a() => {}
} {}
        }


}

Meta

rustfmt --version:

rustfmt 1.10.0-nightly (fd7ed57dfd 2026-08-29)

Error output

Diff in /tmp/im/a.rs:1:
 #![crate_type = "lib"]

-    cfg_select! {
+cfg_select! {
         true => {
             fn foo{
     a() => {}
Backtrace

thread 'main' (652005) panicked at src/tools/rustfmt/src/source_map.rs:31:13:
bad span: `)`: ``
stack backtrace:
   0:     0x7fe4044a1f16 - <<std[c12b020f820b1a60]::sys::backtrace::BacktraceLock>::print::DisplayBacktrace as core[27a82328e35982ef]::fmt::Display>::fmt
   1:     0x7fe404c0b98f - core[27a82328e35982ef]::fmt::write
   2:     0x7fe4044b702c - <std[c12b020f820b1a60]::sys::stdio::unix::Stderr as core[27a82328e35982ef]::io::write::Write>::write_fmt
   3:     0x7fe404474a1a - std[c12b020f820b1a60]::panicking::default_hook::{closure#0}
   4:     0x7fe4044961d3 - std[c12b020f820b1a60]::panicking::default_hook
   5:     0x7fe4033f8bbf - std[c12b020f820b1a60]::panicking::update_hook::<alloc[da1d5361f54fe3ea]::boxed::Box<rustc_driver_impl[c8665e0298a778c0]::install_ice_hook::{closure#1}>>::{closure#0}
   6:     0x7fe404496672 - std[c12b020f820b1a60]::panicking::panic_with_hook
   7:     0x7fe404474ad2 - std[c12b020f820b1a60]::panicking::panic_handler::{closure#0}
   8:     0x7fe40446cba9 - std[c12b020f820b1a60]::sys::backtrace::__rust_end_short_backtrace::<std[c12b020f820b1a60]::panicking::panic_handler::{closure#0}, !>
   9:     0x7fe4044763fd - __rustc[2017c61168e86746]::rust_begin_unwind
  10:     0x7fe40111d73c - core[27a82328e35982ef]::panicking::panic_fmt
  11:     0x556e917e03fe - <rustfmt_nightly[8fca045b5810b375]::visitor::SnippetProvider as rustfmt_nightly[8fca045b5810b375]::source_map::SpanUtils>::span_after::{closure#0}
  12:     0x556e91852bbb - rustfmt_nightly[8fca045b5810b375]::items::rewrite_fn_base
  13:     0x556e917ef3f0 - <rustfmt_nightly[8fca045b5810b375]::visitor::FmtVisitor>::visit_fn
  14:     0x556e917e9807 - <rustfmt_nightly[8fca045b5810b375]::visitor::FmtVisitor>::visit_item
  15:     0x556e917ea970 - <rustfmt_nightly[8fca045b5810b375]::visitor::FmtVisitor>::walk_stmts
  16:     0x556e917ed965 - <rustfmt_nightly[8fca045b5810b375]::visitor::FmtVisitor>::visit_block
  17:     0x556e9184a545 - rustfmt_nightly[8fca045b5810b375]::expr::rewrite_block_with_visitor
  18:     0x556e918417b4 - rustfmt_nightly[8fca045b5810b375]::expr::format_expr
  19:     0x556e9187ab68 - rustfmt_nightly[8fca045b5810b375]::matches::rewrite_match_body
  20:     0x556e917e23c3 - <rustfmt_nightly[8fca045b5810b375]::lists::ListItems<core[27a82328e35982ef]::slice::iter::Iter<rustfmt_nightly[8fca045b5810b375]::parse::macros::cfg_select::CfgSelectArm>, rustfmt_nightly[8fca045b5810b375]::macros::format_cfg_select::{closure#0}, rustfmt_nightly[8fca045b5810b375]::macros::format_cfg_select::{closure#1}, rustfmt_nightly[8fca045b5810b375]::macros::format_cfg_select::{closure#2}> as core[27a82328e35982ef]::iter::traits::iterator::Iterator>::next::{closure#0}
  21:     0x556e91889a0a - <alloc[da1d5361f54fe3ea]::vec::Vec<rustfmt_nightly[8fca045b5810b375]::lists::ListItem> as alloc[da1d5361f54fe3ea]::vec::spec_from_iter_nested::SpecFromIterNested<rustfmt_nightly[8fca045b5810b375]::lists::ListItem, rustfmt_nightly[8fca045b5810b375]::lists::ListItems<core[27a82328e35982ef]::slice::iter::Iter<rustfmt_nightly[8fca045b5810b375]::parse::macros::cfg_select::CfgSelectArm>, rustfmt_nightly[8fca045b5810b375]::macros::format_cfg_select::{closure#0}, rustfmt_nightly[8fca045b5810b375]::macros::format_cfg_select::{closure#1}, rustfmt_nightly[8fca045b5810b375]::macros::format_cfg_select::{closure#2}>>>::from_iter
  22:     0x556e9186892d - rustfmt_nightly[8fca045b5810b375]::macros::rewrite_macro
  23:     0x556e917efe44 - <rustfmt_nightly[8fca045b5810b375]::visitor::FmtVisitor>::visit_mac
  24:     0x556e917e9374 - <rustfmt_nightly[8fca045b5810b375]::visitor::FmtVisitor>::visit_item
  25:     0x556e91832e56 - <rustfmt_nightly[8fca045b5810b375]::visitor::FmtVisitor>::visit_items_with_reordering
  26:     0x556e917ee320 - <rustfmt_nightly[8fca045b5810b375]::visitor::FmtVisitor>::walk_mod_items
  27:     0x556e9176321a - <scoped_tls[175d74dc713e2aa3]::ScopedKey<rustc_span[3b717a46cdec11cc]::SessionGlobals>>::with::<<rustfmt_nightly[8fca045b5810b375]::Session<std[c12b020f820b1a60]::io::stdio::Stdout>>::format_input_inner::{closure#0}, core[27a82328e35982ef]::result::Result<rustfmt_nightly[8fca045b5810b375]::FormatReport, rustfmt_nightly[8fca045b5810b375]::ErrorKind>>
  28:     0x556e9175d61f - rustfmt[53f92ba75be596c0]::format_and_emit_report::<std[c12b020f820b1a60]::io::stdio::Stdout>
  29:     0x556e91772afc - rustfmt[53f92ba75be596c0]::execute
  30:     0x556e9176dd76 - rustfmt[53f92ba75be596c0]::main
  31:     0x556e9176becb - std[c12b020f820b1a60]::sys::backtrace::__rust_begin_short_backtrace::<fn(), ()>
  32:     0x556e9176c859 - std[c12b020f820b1a60]::rt::lang_start::<()>::{closure#0}
  33:     0x7fe405fcd352 - std[c12b020f820b1a60]::rt::lang_start_internal
  34:     0x556e9177d1d8 - main
  35:     0x7fe3ff027781 - <unknown>
  36:     0x7fe3ff0278b9 - __libc_start_main
  37:     0x556e91642cf9 - <unknown>
  38:                0x0 - <unknown>

error: the compiler unexpectedly panicked. This is a bug

note: we would appreciate a bug report: https://github.com/rust-lang/rustfmt/issues/new?labels=bug

note: please make sure that you have updated to the latest nightly

note: please attach the file at `/tmp/im/rustc-ice-2026-08-29T22_10_47-652005.txt` to your bug report

note: rustc 1.100.0-nightly (fd7ed57df 2026-08-29) running on x86_64-unknown-linux-gnu

query stack during panic:
end of query stack
Diff in /tmp/im/a.rs:1:
 #![crate_type = "lib"]

-    cfg_select! {
+cfg_select! {
         true => {
             fn foo{
     a() => {}

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by running rustfmt on the provided cfg_select! example and inspect src/tools/rustfmt/src/source_map.rs, especially the span_after path shown in the backtrace. Trace how cfg_select! formatting reaches rewrite_fn_base, then add regression coverage for this input. Done means rustfmt no longer panics or emits the bad-span ICE report for the reproducer.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
tooling
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
58/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.