Skip to content

Commit df751da

Browse files
committed
simplified attribute parsing. Added error handling
1 parent 6fd06c6 commit df751da

File tree

1 file changed

+32
-26
lines changed

1 file changed

+32
-26
lines changed

compiler/rustc_codegen_ssa/src/codegen_attrs.rs

+32-26
Original file line numberDiff line numberDiff line change
@@ -460,45 +460,51 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
460460
let mut prefix = None;
461461
let mut entry = None;
462462
for item in l {
463-
let Some(metaitem) = item.meta_item() else {
463+
let Some(meta_item) = item.meta_item() else {
464+
tcx.dcx().span_err(item.span(), "Expected name value pair.");
464465
continue;
465466
};
466467

467-
let [single_segment] = &metaitem.path.segments[..] else {
468+
let Some(name_value_lit) = meta_item.name_value_literal() else {
469+
tcx.dcx().span_err(item.span(), "Expected name value pair.");
468470
continue;
469471
};
470472

471-
let attrib_to_write = match single_segment.ident.name {
473+
let attrib_to_write = match meta_item.name_or_empty() {
472474
sym::prefix_nops => &mut prefix,
473-
sym::entry_nops => &mut entry,
474-
_ => {
475-
tcx.dcx().span_err(metaitem.span, "Unexpected parameter.");
476-
continue;
477-
}
478-
};
479-
480-
if let Some(metaitem) =
481-
item.meta_item().map(|e| e.name_value_literal()).flatten()
482-
{
483-
let rustc_ast::LitKind::Int(val, _) = metaitem.kind else {
475+
sym::entry_nops => &mut entry,
476+
_ => {
484477
tcx.dcx().span_err(
485-
metaitem.span,
486-
"Expected integer value between 0 and 255",
478+
item.span(),
479+
format!(
480+
"Unexpected name. Allowed names: {}, {}",
481+
sym::prefix_nops,
482+
sym::entry_nops
483+
),
487484
);
488485
continue;
489-
};
486+
}
487+
};
490488

491-
let Ok(val) = val.get().try_into() else {
492-
tcx.dcx().span_err(
493-
metaitem.span,
494-
"Integer value outside range between 0 and 255.",
495-
);
496-
continue;
497-
};
489+
let rustc_ast::LitKind::Int(val, _) = name_value_lit.kind else {
490+
tcx.dcx().span_err(
491+
name_value_lit.span,
492+
"Expected integer value between 0 and 255.",
493+
);
494+
continue;
495+
};
498496

499-
*attrib_to_write = Some(val);
500-
}
497+
let Ok(val) = val.get().try_into() else {
498+
tcx.dcx().span_err(
499+
name_value_lit.span,
500+
"Integer value outside range between 0 and 255.",
501+
);
502+
continue;
503+
};
504+
505+
*attrib_to_write = Some(val);
501506
}
507+
502508
if let (None, None) = (prefix, entry) {
503509
tcx.dcx().span_err(attr.span, "Must specify at least one parameter.");
504510
}

0 commit comments

Comments
 (0)