Add ErrorGuaranteed
to ast::LitKind::Err
, token::LitKind::Err
.
This mostly works well, and eliminates a couple of delayed bugs. One annoying thing is that we should really also add an `ErrorGuaranteed` to `proc_macro::bridge::LitKind::Err`. But that's difficult because `proc_macro` doesn't have access to `ErrorGuaranteed`, so we have to fake it.
This commit is contained in:
parent
332c57723a
commit
25ed6e43b0
26 changed files with 85 additions and 64 deletions
|
@ -481,8 +481,8 @@ impl<'sess, 'src> StringReader<'sess, 'src> {
|
|||
let mut kind = token::Integer;
|
||||
if empty_int {
|
||||
let span = self.mk_sp(start, end);
|
||||
self.dcx().emit_err(errors::NoDigitsLiteral { span });
|
||||
kind = token::Err;
|
||||
let guar = self.dcx().emit_err(errors::NoDigitsLiteral { span });
|
||||
kind = token::Err(guar);
|
||||
} else if matches!(base, Base::Binary | Base::Octal) {
|
||||
let base = base as u32;
|
||||
let s = self.str_from_to(start + BytePos(2), end);
|
||||
|
@ -492,8 +492,9 @@ impl<'sess, 'src> StringReader<'sess, 'src> {
|
|||
start + BytePos::from_usize(2 + idx + c.len_utf8()),
|
||||
);
|
||||
if c != '_' && c.to_digit(base).is_none() {
|
||||
self.dcx().emit_err(errors::InvalidDigitLiteral { span, base });
|
||||
kind = token::Err;
|
||||
let guar =
|
||||
self.dcx().emit_err(errors::InvalidDigitLiteral { span, base });
|
||||
kind = token::Err(guar);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -711,7 +712,7 @@ impl<'sess, 'src> StringReader<'sess, 'src> {
|
|||
let hi = lo + BytePos(end - start);
|
||||
let span = self.mk_sp(lo, hi);
|
||||
let is_fatal = err.is_fatal();
|
||||
if let Some(_guar) = emit_unescape_error(
|
||||
if let Some(guar) = emit_unescape_error(
|
||||
self.dcx(),
|
||||
lit_content,
|
||||
span_with_quotes,
|
||||
|
@ -721,18 +722,19 @@ impl<'sess, 'src> StringReader<'sess, 'src> {
|
|||
err,
|
||||
) {
|
||||
assert!(is_fatal);
|
||||
kind = token::Err;
|
||||
kind = token::Err(guar);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// We normally exclude the quotes for the symbol, but for errors we
|
||||
// include it because it results in clearer error messages.
|
||||
if kind != token::Err {
|
||||
(kind, Symbol::intern(lit_content))
|
||||
let sym = if !matches!(kind, token::Err(_)) {
|
||||
Symbol::intern(lit_content)
|
||||
} else {
|
||||
(token::Err, self.symbol_from_to(start, end))
|
||||
}
|
||||
self.symbol_from_to(start, end)
|
||||
};
|
||||
(kind, sym)
|
||||
}
|
||||
|
||||
fn cook_unicode(
|
||||
|
|
|
@ -2140,12 +2140,12 @@ impl<'a> Parser<'a> {
|
|||
Err(err) => {
|
||||
let span = token.uninterpolated_span();
|
||||
self.bump();
|
||||
report_lit_error(self.sess, err, lit, span);
|
||||
let guar = report_lit_error(self.sess, err, lit, span);
|
||||
// Pack possible quotes and prefixes from the original literal into
|
||||
// the error literal's symbol so they can be pretty-printed faithfully.
|
||||
let suffixless_lit = token::Lit::new(lit.kind, lit.symbol, None);
|
||||
let symbol = Symbol::intern(&suffixless_lit.to_string());
|
||||
let lit = token::Lit::new(token::Err, symbol, lit.suffix);
|
||||
let lit = token::Lit::new(token::Err(guar), symbol, lit.suffix);
|
||||
Some(
|
||||
MetaItemLit::from_token_lit(lit, span)
|
||||
.unwrap_or_else(|_| unreachable!()),
|
||||
|
|
|
@ -1459,7 +1459,7 @@ impl<'a> Parser<'a> {
|
|||
match self.parse_str_lit() {
|
||||
Ok(str_lit) => Some(str_lit),
|
||||
Err(Some(lit)) => match lit.kind {
|
||||
ast::LitKind::Err => None,
|
||||
ast::LitKind::Err(_) => None,
|
||||
_ => {
|
||||
self.dcx().emit_err(NonStringAbiLiteral { span: lit.span });
|
||||
None
|
||||
|
|
|
@ -70,11 +70,11 @@ pub fn parse_meta<'a>(sess: &'a ParseSess, attr: &Attribute) -> PResult<'a, Meta
|
|||
}
|
||||
}
|
||||
Err(err) => {
|
||||
report_lit_error(sess, err, token_lit, expr.span);
|
||||
let guar = report_lit_error(sess, err, token_lit, expr.span);
|
||||
let lit = ast::MetaItemLit {
|
||||
symbol: token_lit.symbol,
|
||||
suffix: token_lit.suffix,
|
||||
kind: ast::LitKind::Err,
|
||||
kind: ast::LitKind::Err(guar),
|
||||
span: expr.span,
|
||||
};
|
||||
MetaItemKind::NameValue(lit)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue