Rust: dengan #! [no_std] diaktifkan, 'panic! ("{{}}")' dan 'panic! ("{{}}",)' berbeda

Dibuat pada 7 Feb 2018  ·  1Komentar  ·  Sumber: rust-lang/rust

Ditemukan saat mencoba menerapkan perbaikan untuk # 46241. Kemungkinan bahaya back-compat karena membuntuti dukungan koma, tapi mudah-mudahan tidak.

libstd / macros.rs

macro_rules! panic {
    () => (/* default message */);
    ($msg:expr) => (/* use msg as literal */);
    ($fmt:expr, $($arg:tt)+) => (/* use format_args! */);
}

libcore / macros.rs

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>) . ~

A-macros C-bug T-libs

Komentar yang paling membantu

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 "{}"
}

>Semua komentar

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 "{}"
}
Apakah halaman ini membantu?
0 / 5 - 0 peringkat