Skip to content

rustfix panics with "cannot replace slice of data that was already replaced" on *touching* spans #15619

Open
@WaffleLapkin

Description

@WaffleLapkin

I was working on a rustc suggestion which turns tuple struct literal into a named struct literal. That is, it changes Struct(a) into Struct { 0: a }.

This change consists of two parts:

  • Changing parens into braces (() -> {})
  • Adding indices (0:)

The trivial way to do this is to replace the span of ( with { and then add 0: before a. However, this causes rustfix to panic with "cannot replace slice of data that was already replaced", even though the spans aren't overlapping!

The two spans are "the span of ( (1 length)" and "the span between ( and a (zero-length)". They are touching, but importantly not overlapping.

I made a workaround for this in rustc, but ideally rustfix would support this.
https://github.com/rust-lang/rust/blob/8f765fc7a15b6a2f1de93251b9f65c6156fbfe33/compiler/rustc_resolve/src/late/diagnostics.rs#L1979-L1987

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: bugCommand-fixS-triageStatus: This issue is waiting on initial triage.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions