- 
                Notifications
    You must be signed in to change notification settings 
- Fork 13.9k
Closed
Description
The following code changed output between Rust 1.37.0 and 1.38.0:
macro_rules! call_a_or_b_on_tail {
    ((a: $a:expr, b: $b:expr), call a: $($tail:tt)*) => {
        $a(stringify!($($tail)*))
    };
    ((a: $a:expr, b: $b:expr), call b: $($tail:tt)*) => {
        $b(stringify!($($tail)*))
    };
    ($ab:tt, $_skip:tt $($tail:tt)*) => {
        call_a_or_b_on_tail!($ab, $($tail)*)
    };
}
fn compute_len(s: &str) -> usize {
    s.len()
}
fn main() {
    println!(
        "{expr1}\n{expr2}",
        expr1 = call_a_or_b_on_tail!(
            (a: compute_len, b: zero),
                and now, to justify the existence of two paths
                we will also call a: its input should somehow
                be self-referential, so let's make it return
                some ninety one!
        ),
        expr2 = call_a_or_b_on_tail!(
            (a: compute_len, b: zero),
                and now, to justify the existence of two paths
                we will also call a: its input should somehow
                be self-referential, so let's make it return
                some ninety "(\"()"nine!
        ),
    );
}djc-ing master regress $ cargo run
   Compiling regress v0.1.0 (/Users/djc/src/regress)
    Finished dev [unoptimized + debuginfo] target(s) in 0.35s
     Running `target/debug/regress`
90
98
djc-ing master regress $ cargo +1.37.0 run
   Compiling regress v0.1.0 (/Users/djc/src/regress)
    Finished dev [unoptimized + debuginfo] target(s) in 0.30s
     Running `target/debug/regress`
91
99
Playground: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6f67da3ab63067c8186ca702fe1c1910
Metadata
Metadata
Assignees
Labels
No labels