// run-pass // needs-unwind #![allow(unused_imports)] // Ideally, any macro call with a trailing comma should behave // identically to a call without the comma. // // This checks the behavior of macros with trailing commas in key // places where regressions in behavior seem highly possible (due // to it being e.g., a place where the addition of an argument // causes it to go down a code path with subtly different behavior). // // There is a companion failing test. // compile-flags: --test -C debug_assertions=yes // revisions: std core #![cfg_attr(core, no_std)] #[cfg(core)] use core::fmt; #[cfg(std)] use std::fmt; // an easy mistake in the implementation of 'assert!' // would cause this to say "explicit panic" #[test] #[should_panic(expected = "assertion failed")] fn assert_1arg() { assert!(false,); } // same as 'assert_1arg' #[test] #[should_panic(expected = "assertion failed")] fn debug_assert_1arg() { debug_assert!(false,); } // make sure we don't accidentally forward to `write!("text")` #[cfg(std)] #[test] fn writeln_1arg() { use fmt::Write; let mut s = String::new(); writeln!(&mut s,).unwrap(); assert_eq!(&s, "\n"); } // A number of format_args-like macros have special-case treatment // for a single message string, which is not formatted. // // This test ensures that the addition of a trailing comma does not // suddenly cause these strings to get formatted when they otherwise // would not be. This is an easy mistake to make by having such a macro // accept ", $($tok:tt)*" instead of ", $($tok:tt)+" after its minimal // set of arguments. // // (Example: Issue #48042) #[test] #[allow(non_fmt_panics)] fn to_format_or_not_to_format() { // ("{}" is the easiest string to test because if this gets // sent to format_args!, it'll simply fail to compile. // "{{}}" is an example of an input that could compile and // produce an incorrect program, but testing the panics // would be burdensome.) let falsum = || false; assert!(true, "{}",); // assert_eq!(1, 1, "{}",); // see check-fail // assert_ne!(1, 2, "{}",); // see check-fail debug_assert!(true, "{}",); // debug_assert_eq!(1, 1, "{}",); // see check-fail // debug_assert_ne!(1, 2, "{}",); // see check-fail // eprint!("{}",); // see check-fail // eprintln!("{}",); // see check-fail // format!("{}",); // see check-fail // format_args!("{}",); // see check-fail if falsum() { panic!("{}",); } // print!("{}",); // see check-fail // println!("{}",); // see check-fail // unimplemented!("{}",); // see check-fail if falsum() { unreachable!("{}",); } // write!(&mut stdout, "{}",); // see check-fail // writeln!(&mut stdout, "{}",); // see check-fail }