Avoid an unwrap in RustcMirAttrs::set_field.

This commit is contained in:
Nicholas Nethercote 2025-04-16 09:19:52 +10:00
parent 2fef0a30ae
commit 846c10fecf

View file

@ -109,27 +109,29 @@ impl RustcMirAttrs {
.flat_map(|attr| attr.meta_item_list().into_iter().flat_map(|v| v.into_iter())); .flat_map(|attr| attr.meta_item_list().into_iter().flat_map(|v| v.into_iter()));
for attr in rustc_mir_attrs { for attr in rustc_mir_attrs {
let attr_result = if attr.has_name(sym::borrowck_graphviz_postflow) { let attr_result = match attr.name() {
Self::set_field(&mut ret.basename_and_suffix, tcx, &attr, |s| { Some(name @ sym::borrowck_graphviz_postflow) => {
let path = PathBuf::from(s.to_string()); Self::set_field(&mut ret.basename_and_suffix, tcx, name, &attr, |s| {
match path.file_name() { let path = PathBuf::from(s.to_string());
Some(_) => Ok(path), match path.file_name() {
None => { Some(_) => Ok(path),
tcx.dcx().emit_err(PathMustEndInFilename { span: attr.span() }); None => {
tcx.dcx().emit_err(PathMustEndInFilename { span: attr.span() });
Err(())
}
}
})
}
Some(name @ sym::borrowck_graphviz_format) => {
Self::set_field(&mut ret.formatter, tcx, name, &attr, |s| match s {
sym::two_phase => Ok(s),
_ => {
tcx.dcx().emit_err(UnknownFormatter { span: attr.span() });
Err(()) Err(())
} }
} })
}) }
} else if attr.has_name(sym::borrowck_graphviz_format) { _ => Ok(()),
Self::set_field(&mut ret.formatter, tcx, &attr, |s| match s {
sym::two_phase => Ok(s),
_ => {
tcx.dcx().emit_err(UnknownFormatter { span: attr.span() });
Err(())
}
})
} else {
Ok(())
}; };
result = result.and(attr_result); result = result.and(attr_result);
@ -141,13 +143,12 @@ impl RustcMirAttrs {
fn set_field<T>( fn set_field<T>(
field: &mut Option<T>, field: &mut Option<T>,
tcx: TyCtxt<'_>, tcx: TyCtxt<'_>,
name: Symbol,
attr: &ast::MetaItemInner, attr: &ast::MetaItemInner,
mapper: impl FnOnce(Symbol) -> Result<T, ()>, mapper: impl FnOnce(Symbol) -> Result<T, ()>,
) -> Result<(), ()> { ) -> Result<(), ()> {
// Unwrapping the name is safe because this is only called when `has_name` has succeeded.
if field.is_some() { if field.is_some() {
tcx.dcx() tcx.dcx().emit_err(DuplicateValuesFor { span: attr.span(), name });
.emit_err(DuplicateValuesFor { span: attr.span(), name: attr.name().unwrap() });
return Err(()); return Err(());
} }