@@ -13,7 +13,7 @@ use rustc_ast_pretty::pprust;
1313use rustc_errors::DiagCtxtHandle;
1414use rustc_hir::{self as hir, AttrPath};
1515use rustc_span::symbol::{Ident, kw};
16- use rustc_span::{DUMMY_SP, ErrorGuaranteed, Span, Symbol};
16+ use rustc_span::{ErrorGuaranteed, Span, Symbol};
1717
1818pub struct SegmentIterator<'a> {
1919 offset: usize,
@@ -127,7 +127,7 @@ impl<'a> ArgParser<'a> {
127127 }
128128 AttrArgs::Eq { eq_span, expr } => Self::NameValue(NameValueParser {
129129 eq_span: *eq_span,
130- value: expr_to_lit(dcx, &expr),
130+ value: expr_to_lit(dcx, &expr, *eq_span ),
131131 value_span: expr.span,
132132 }),
133133 }
@@ -348,16 +348,19 @@ impl NameValueParser {
348348 }
349349}
350350
351- fn expr_to_lit(dcx: DiagCtxtHandle<'_>, expr: &Expr) -> MetaItemLit {
351+ fn expr_to_lit(dcx: DiagCtxtHandle<'_>, expr: &Expr, span: Span ) -> MetaItemLit {
352352 // In valid code the value always ends up as a single literal. Otherwise, a dummy
353353 // literal suffices because the error is handled elsewhere.
354354 if let ExprKind::Lit(token_lit) = expr.kind
355355 && let Ok(lit) = MetaItemLit::from_token_lit(token_lit, expr.span)
356356 {
357357 lit
358358 } else {
359- let guar = dcx.has_errors().unwrap();
360- MetaItemLit { symbol: kw::Empty, suffix: None, kind: LitKind::Err(guar), span: DUMMY_SP }
359+ let guar = dcx.span_delayed_bug(
360+ span,
361+ "expr in place where literal is expected (builtin attr parsing)",
362+ );
363+ MetaItemLit { symbol: kw::Empty, suffix: None, kind: LitKind::Err(guar), span }
361364 }
362365}
363366
0 commit comments