Ditemukan saat mencoba menerapkan perbaikan untuk # 46241. Kemungkinan bahaya back-compat karena membuntuti dukungan koma, tapi mudah-mudahan tidak.
macro_rules! panic {
() => (/* default message */);
($msg:expr) => (/* use msg as literal */);
($fmt:expr, $($arg:tt)+) => (/* use format_args! */);
}
macro_rules! panic {
() => (/* default message */);
($msg:expr) => (/* use msg as literal */);
($fmt:expr, $($arg:tt)*) => (/* use format_args! */);
}
Bisakah Anda melihat perbedaannya?
Definisi dalam std gagal mendukung tanda koma setelah string literal tunggal:
fn main() {
panic!("a");
panic!("a",); //~ ERROR unexpected end of macro invocation
panic!("{}");
panic!("{}",); //~ ERROR unexpected end of macro invocation
}
Definisi dalam inti menerima tanda koma, tetapi mengikuti jalur kode yang sama sekali berbeda dengan semantik yang berpotensi berbeda.
#![no_std]
fn main() {
panic!("a");
panic!("a",);
panic!("{}");
panic!("{}",); //~ ERROR 1 positional argument in format string, but no arguments were given
}
~ Kebetulan, menurut saya definisi libcore menghasilkan perilaku yang setara untuk panic!(<literal>,)
dan panic!(<literal>)
dalam semua kasus di mana kedua formulir berhasil dikompilasi, yang berarti semoga aman untuk mengubah panic!(<literal>,)
berperilaku seperti panic!(<literal>)
. ~
Sampah. Menemukan contoh bahaya back-compat yang saya bicarakan.
Dalam Rust hari ini, dua program berikut berbeda:
#![no_std]
fn main() {
panic!("{{}}"); // panics with "{{}}"
}
#![no_std]
fn main() {
panic!("{{}}",); // panics with "{}"
}
Komentar yang paling membantu
Sampah. Menemukan contoh bahaya back-compat yang saya bicarakan.
Dalam Rust hari ini, dua program berikut berbeda: