|
1 | 1 | use rustc_ast::{ast, attr, MetaItemKind, NestedMetaItem}; |
2 | 2 | use rustc_attr::{list_contains_name, InlineAttr, InstructionSetAttr, OptimizeAttr}; |
3 | | -use rustc_data_structures::packed::Pu128; |
4 | | -use rustc_errors::{codes::*, struct_span_code_err}; |
| 3 | +use rustc_errors::{codes::*, struct_span_code_err, DiagMessage, SubdiagMessage}; |
5 | 4 | use rustc_hir as hir; |
6 | 5 | use rustc_hir::def::DefKind; |
7 | 6 | use rustc_hir::def_id::{DefId, LocalDefId, LOCAL_CRATE}; |
@@ -472,45 +471,66 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs { |
472 | 471 | let mut entry = None; |
473 | 472 | for item in l { |
474 | 473 | let Some(meta_item) = item.meta_item() else { |
475 | | - tcx.dcx().span_err(item.span(), "Expected name value pair."); |
| 474 | + tcx.dcx().span_err(item.span(), "expected name value pair"); |
476 | 475 | continue; |
477 | 476 | }; |
478 | 477 |
|
479 | 478 | let Some(name_value_lit) = meta_item.name_value_literal() else { |
480 | | - tcx.dcx().span_err(item.span(), "Expected name value pair."); |
| 479 | + tcx.dcx().span_err(item.span(), "expected name value pair"); |
481 | 480 | continue; |
482 | 481 | }; |
483 | 482 |
|
| 483 | + fn emit_error_with_label( |
| 484 | + tcx: TyCtxt<'_>, |
| 485 | + span: Span, |
| 486 | + error: impl Into<DiagMessage>, |
| 487 | + label: impl Into<SubdiagMessage>, |
| 488 | + ) { |
| 489 | + let mut err: rustc_errors::Diag<'_, _> = |
| 490 | + tcx.dcx().struct_span_err(span, error); |
| 491 | + err.span_label(span, label); |
| 492 | + err.emit(); |
| 493 | + } |
| 494 | + |
484 | 495 | let attrib_to_write = match meta_item.name_or_empty() { |
485 | 496 | sym::prefix_nops => &mut prefix, |
486 | 497 | sym::entry_nops => &mut entry, |
487 | 498 | _ => { |
488 | | - tcx.dcx().span_err( |
| 499 | + emit_error_with_label( |
| 500 | + tcx, |
489 | 501 | item.span(), |
490 | | - format!( |
491 | | - "Unexpected parameter name. Allowed names: {}, {}", |
492 | | - sym::prefix_nops, |
493 | | - sym::entry_nops |
494 | | - ), |
| 502 | + "unexpected parameter name", |
| 503 | + format!("expected {} or {}", sym::prefix_nops, sym::entry_nops), |
495 | 504 | ); |
496 | 505 | continue; |
497 | 506 | } |
498 | 507 | }; |
499 | 508 |
|
500 | | - let rustc_ast::LitKind::Int(Pu128(val @ 0..=255), _) = name_value_lit.kind |
501 | | - else { |
502 | | - tcx.dcx().span_err( |
| 509 | + let rustc_ast::LitKind::Int(val, _) = name_value_lit.kind else { |
| 510 | + emit_error_with_label( |
| 511 | + tcx, |
| 512 | + name_value_lit.span, |
| 513 | + "invalid literal value", |
| 514 | + "value must be an integer between `0` and `255`", |
| 515 | + ); |
| 516 | + continue; |
| 517 | + }; |
| 518 | + |
| 519 | + let Ok(val) = val.get().try_into() else { |
| 520 | + emit_error_with_label( |
| 521 | + tcx, |
503 | 522 | name_value_lit.span, |
504 | | - "Expected integer value between 0 and 255.", |
| 523 | + "integer value out of range", |
| 524 | + "value must be between `0` and `255`", |
505 | 525 | ); |
506 | 526 | continue; |
507 | 527 | }; |
508 | 528 |
|
509 | | - *attrib_to_write = Some(val.try_into().unwrap()); |
| 529 | + *attrib_to_write = Some(val); |
510 | 530 | } |
511 | 531 |
|
512 | 532 | if let (None, None) = (prefix, entry) { |
513 | | - tcx.dcx().span_err(attr.span, "Must specify at least one parameter."); |
| 533 | + tcx.dcx().span_err(attr.span, "must specify at least one parameter"); |
514 | 534 | } |
515 | 535 |
|
516 | 536 | Some(PatchableFunctionEntry::from_prefix_and_entry( |
|
0 commit comments