|
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