From df751daf63dcfc346e8a65f16e8de32365fb38a6 Mon Sep 17 00:00:00 2001 From: Florian Schmiderer Date: Fri, 10 May 2024 09:55:29 +0200 Subject: [PATCH] simplified attribute parsing. Added error handling --- .../rustc_codegen_ssa/src/codegen_attrs.rs | 58 ++++++++++--------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/compiler/rustc_codegen_ssa/src/codegen_attrs.rs b/compiler/rustc_codegen_ssa/src/codegen_attrs.rs index 01cbc04e24be2..7d69036604034 100644 --- a/compiler/rustc_codegen_ssa/src/codegen_attrs.rs +++ b/compiler/rustc_codegen_ssa/src/codegen_attrs.rs @@ -460,45 +460,51 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs { let mut prefix = None; let mut entry = None; for item in l { - let Some(metaitem) = item.meta_item() else { + let Some(meta_item) = item.meta_item() else { + tcx.dcx().span_err(item.span(), "Expected name value pair."); continue; }; - let [single_segment] = &metaitem.path.segments[..] else { + let Some(name_value_lit) = meta_item.name_value_literal() else { + tcx.dcx().span_err(item.span(), "Expected name value pair."); continue; }; - let attrib_to_write = match single_segment.ident.name { + let attrib_to_write = match meta_item.name_or_empty() { sym::prefix_nops => &mut prefix, - sym::entry_nops => &mut entry, - _ => { - tcx.dcx().span_err(metaitem.span, "Unexpected parameter."); - continue; - } - }; - - if let Some(metaitem) = - item.meta_item().map(|e| e.name_value_literal()).flatten() - { - let rustc_ast::LitKind::Int(val, _) = metaitem.kind else { + sym::entry_nops => &mut entry, + _ => { tcx.dcx().span_err( - metaitem.span, - "Expected integer value between 0 and 255", + item.span(), + format!( + "Unexpected name. Allowed names: {}, {}", + sym::prefix_nops, + sym::entry_nops + ), ); continue; - }; + } + }; - let Ok(val) = val.get().try_into() else { - tcx.dcx().span_err( - metaitem.span, - "Integer value outside range between 0 and 255.", - ); - continue; - }; + let rustc_ast::LitKind::Int(val, _) = name_value_lit.kind else { + tcx.dcx().span_err( + name_value_lit.span, + "Expected integer value between 0 and 255.", + ); + continue; + }; - *attrib_to_write = Some(val); - } + let Ok(val) = val.get().try_into() else { + tcx.dcx().span_err( + name_value_lit.span, + "Integer value outside range between 0 and 255.", + ); + continue; + }; + + *attrib_to_write = Some(val); } + if let (None, None) = (prefix, entry) { tcx.dcx().span_err(attr.span, "Must specify at least one parameter."); }