You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
with #![no_std] enabled, 'panic!("{{}}")' and 'panic!("{{}}",)' are different #48042
macro_rules! panic {() => (/* default message */);($msg:expr) => (/* use msg as literal */);($fmt:expr, $($arg:tt)*) => (/* use format_args! */);}
Can you spot the difference?
The definition in std fails to support trailing commas after a single string literal:
fnmain(){panic!("a");panic!("a",);//~ ERROR unexpected end of macro invocationpanic!("{}");panic!("{}",);//~ ERROR unexpected end of macro invocation}
The definition in core accepts a trailing comma, but follows a completely different code-path with potentially different semantics.
#![no_std]fnmain(){panic!("a");panic!("a",);panic!("{}");panic!("{}",);//~ ERROR 1 positional argument in format string, but no arguments were given}
Fortuitously, it seems to me that it libcore's definition produces equivalent behavior for panic!(<literal>,) and panic!(<literal>) in all cases where both forms successfully compile, meaning it should hopefully be safe to change panic!(<literal>,) to behave like panic!(<literal>).
changed the title [-]with #![no_std] enabled, 'panic!(<literal>,)' compiles and is not necessarily the same as 'panic!(<literal>)'[/-][+]with #![no_std] enabled, 'panic!(<literal>,)' compiles and is different from 'panic!(<literal>)'[/+]on Feb 7, 2018
changed the title [-]with #![no_std] enabled, 'panic!(<literal>,)' compiles and is different from 'panic!(<literal>)'[/-][+]with #![no_std] enabled, 'panic!("{{}}")' and 'panic!("{{}}",)' are different[/+]on Feb 7, 2018
Activity
ExpHP commentedon Feb 7, 2018
Crap. Found an example of the sort of back-compat hazard I was talking about.
In today's rust, the following two programs are different:
[-]with #![no_std] enabled, 'panic!(<literal>,)' compiles and is not necessarily the same as 'panic!(<literal>)'[/-][+]with #![no_std] enabled, 'panic!(<literal>,)' compiles and is different from 'panic!(<literal>)'[/+][-]with #![no_std] enabled, 'panic!(<literal>,)' compiles and is different from 'panic!(<literal>)'[/-][+]with #![no_std] enabled, 'panic!("{{}}")' and 'panic!("{{}}",)' are different[/+]Rollup merge of rust-lang#48056 - ExpHP:macro-commas, r=dtolnay
Auto merge of #48056 - ExpHP:macro-commas, r=dtolnay