mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-01 07:48:45 +00:00
Fix unwrap on None in expanding format args
This commit is contained in:
parent
dcab226210
commit
30e16e20d0
2 changed files with 41 additions and 4 deletions
|
@ -207,6 +207,44 @@ fn main() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn regression_15002() {
|
||||||
|
check(
|
||||||
|
r#"
|
||||||
|
#[rustc_builtin_macro]
|
||||||
|
macro_rules! format_args {
|
||||||
|
($fmt:expr) => ({ /* compiler built-in */ });
|
||||||
|
($fmt:expr, $($args:tt)*) => ({ /* compiler built-in */ })
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
format_args!(x = 2);
|
||||||
|
format_args!(x =);
|
||||||
|
format_args!(x =, x = 2);
|
||||||
|
format_args!("{}", x =);
|
||||||
|
format_args!(=, "{}", x =);
|
||||||
|
format_args!(x = 2, "{}", 5);
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
expect![[r##"
|
||||||
|
#[rustc_builtin_macro]
|
||||||
|
macro_rules! format_args {
|
||||||
|
($fmt:expr) => ({ /* compiler built-in */ });
|
||||||
|
($fmt:expr, $($args:tt)*) => ({ /* compiler built-in */ })
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
/* error: no rule matches input tokens */;
|
||||||
|
/* error: no rule matches input tokens */;
|
||||||
|
/* error: no rule matches input tokens */;
|
||||||
|
/* error: no rule matches input tokens */::core::fmt::Arguments::new_v1(&["", ], &[::core::fmt::Argument::new(&(), ::core::fmt::Display::fmt), ]);
|
||||||
|
/* error: no rule matches input tokens */;
|
||||||
|
::core::fmt::Arguments::new_v1(&["", ], &[::core::fmt::Argument::new(&(5), ::core::fmt::Display::fmt), ]);
|
||||||
|
}
|
||||||
|
"##]],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_format_args_expand_with_comma_exprs() {
|
fn test_format_args_expand_with_comma_exprs() {
|
||||||
check(
|
check(
|
||||||
|
|
|
@ -262,9 +262,6 @@ fn format_args_expand_general(
|
||||||
let expand_error =
|
let expand_error =
|
||||||
ExpandResult::new(tt::Subtree::empty(), mbe::ExpandError::NoMatchingRule.into());
|
ExpandResult::new(tt::Subtree::empty(), mbe::ExpandError::NoMatchingRule.into());
|
||||||
|
|
||||||
if args.is_empty() {
|
|
||||||
return expand_error;
|
|
||||||
}
|
|
||||||
let mut key_args = FxHashMap::default();
|
let mut key_args = FxHashMap::default();
|
||||||
let mut args = args.into_iter().filter_map(|mut arg| {
|
let mut args = args.into_iter().filter_map(|mut arg| {
|
||||||
// Remove `key =`.
|
// Remove `key =`.
|
||||||
|
@ -281,7 +278,9 @@ fn format_args_expand_general(
|
||||||
Some(arg)
|
Some(arg)
|
||||||
}).collect::<Vec<_>>().into_iter();
|
}).collect::<Vec<_>>().into_iter();
|
||||||
// ^^^^^^^ we need this collect, to enforce the side effect of the filter_map closure (building the `key_args`)
|
// ^^^^^^^ we need this collect, to enforce the side effect of the filter_map closure (building the `key_args`)
|
||||||
let format_subtree = args.next().unwrap();
|
let Some(format_subtree) = args.next() else {
|
||||||
|
return expand_error;
|
||||||
|
};
|
||||||
let format_string = (|| {
|
let format_string = (|| {
|
||||||
let token_tree = format_subtree.token_trees.get(0)?;
|
let token_tree = format_subtree.token_trees.get(0)?;
|
||||||
match token_tree {
|
match token_tree {
|
||||||
|
|
Loading…
Reference in a new issue