Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix proc macro panicked with Invalid type in const_random! in Rust 1.77. #33

Merged

Commits on Jan 26, 2024

  1. Fix proc macro panicked with Invalid type in const_random! in R…

    …ust 1.77.
    
    With Rust nightly 1.77, any invocation of `const_random!` with a `u8`
    array causes a compile-time panic. This can be seen when running `cargo
    test`:
    ```
    error: proc macro panicked
      --> tests/tests.rs:52:28
       |
    52 |     const VALUE1: &[u8] = &const_random!([u8; 30]);
       |                            ^^^^^^^^^^^^^^^^^^^^^^^
       |
       = help: message: Invalid type
    ```
    This is because the proc macro starts by calling `to_string` on the
    input token stream, and then uses substring matching to "parse" it. In
    Rust 1.77 the `Display` impl for `TokenStream` has changed, and what
    used to be converted to the string `"[u8 ; 30]"` is now `"[u8; 30]"`. As
    a result, the `byte_array.starts_with("[u8 ; ")` call fails.
    
    Note that substring matching is inherently flawed because the whitespace
    in the output of `to_string` is not guaranteed.
    
    This commit rewrites the proc macro to be robust in the face of
    `to_string` whitespace changes, by iterating over the individual
    `TokenTrees`s.
    
    The commit also adds a comment explaining why `usize` and `isize` are
    handled differently, because it's subtle.
    
    Note: I ran `cargo fmt` within `macro/` to format the changes to
    `macro/src/lib.rs` and it made some minor changes to `macro/src/span.rs`
    as well.
    nnethercote committed Jan 26, 2024
    Configuration menu
    Copy the full SHA
    618d64c View commit details
    Browse the repository at this point in the history