Add ErrorGuaranteed to HIR ExprKind::Err

This commit is contained in:
Michael Goulet 2023-02-22 22:40:06 +00:00
parent a772a6fc2a
commit c0e58c3420
14 changed files with 50 additions and 33 deletions

View file

@ -88,8 +88,8 @@ impl<'hir> LoweringContext<'_, 'hir> {
let kind = hir::ExprKind::Box(self.lower_expr(&inner)); let kind = hir::ExprKind::Box(self.lower_expr(&inner));
return hir::Expr { hir_id, kind, span: self.lower_span(e.span) }; return hir::Expr { hir_id, kind, span: self.lower_span(e.span) };
} else { } else {
self.tcx.sess.emit_err(RustcBoxAttributeError { span: e.span }); let guar = self.tcx.sess.emit_err(RustcBoxAttributeError { span: e.span });
hir::ExprKind::Err hir::ExprKind::Err(guar)
} }
} else if let Some(legacy_args) = self.resolver.legacy_const_generic_args(f) { } else if let Some(legacy_args) = self.resolver.legacy_const_generic_args(f) {
self.lower_legacy_const_generics((**f).clone(), args.clone(), &legacy_args) self.lower_legacy_const_generics((**f).clone(), args.clone(), &legacy_args)
@ -266,8 +266,8 @@ impl<'hir> LoweringContext<'_, 'hir> {
self.lower_expr_range(e.span, e1.as_deref(), e2.as_deref(), *lims) self.lower_expr_range(e.span, e1.as_deref(), e2.as_deref(), *lims)
} }
ExprKind::Underscore => { ExprKind::Underscore => {
self.tcx.sess.emit_err(UnderscoreExprLhsAssign { span: e.span }); let guar = self.tcx.sess.emit_err(UnderscoreExprLhsAssign { span: e.span });
hir::ExprKind::Err hir::ExprKind::Err(guar)
} }
ExprKind::Path(qself, path) => { ExprKind::Path(qself, path) => {
let qpath = self.lower_qpath( let qpath = self.lower_qpath(
@ -299,8 +299,9 @@ impl<'hir> LoweringContext<'_, 'hir> {
let rest = match &se.rest { let rest = match &se.rest {
StructRest::Base(e) => Some(self.lower_expr(e)), StructRest::Base(e) => Some(self.lower_expr(e)),
StructRest::Rest(sp) => { StructRest::Rest(sp) => {
self.tcx.sess.emit_err(BaseExpressionDoubleDot { span: *sp }); let guar =
Some(&*self.arena.alloc(self.expr_err(*sp))) self.tcx.sess.emit_err(BaseExpressionDoubleDot { span: *sp });
Some(&*self.arena.alloc(self.expr_err(*sp, guar)))
} }
StructRest::None => None, StructRest::None => None,
}; };
@ -318,7 +319,9 @@ impl<'hir> LoweringContext<'_, 'hir> {
) )
} }
ExprKind::Yield(opt_expr) => self.lower_expr_yield(e.span, opt_expr.as_deref()), ExprKind::Yield(opt_expr) => self.lower_expr_yield(e.span, opt_expr.as_deref()),
ExprKind::Err => hir::ExprKind::Err, ExprKind::Err => hir::ExprKind::Err(
self.tcx.sess.delay_span_bug(e.span, "lowered ExprKind::Err"),
),
ExprKind::Try(sub_expr) => self.lower_expr_try(e.span, sub_expr), ExprKind::Try(sub_expr) => self.lower_expr_try(e.span, sub_expr),
ExprKind::Paren(_) | ExprKind::ForLoop(..) => unreachable!("already handled"), ExprKind::Paren(_) | ExprKind::ForLoop(..) => unreachable!("already handled"),
@ -761,7 +764,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
self.expr_ident_mut(span, task_context_ident, task_context_hid) self.expr_ident_mut(span, task_context_ident, task_context_hid)
} else { } else {
// Use of `await` outside of an async context, we cannot use `task_context` here. // Use of `await` outside of an async context, we cannot use `task_context` here.
self.expr_err(span) self.expr_err(span, self.tcx.sess.delay_span_bug(span, "no task_context hir id"))
}; };
let new_unchecked = self.expr_call_lang_item_fn_mut( let new_unchecked = self.expr_call_lang_item_fn_mut(
span, span,

View file

@ -102,7 +102,12 @@ fn make_count<'hir>(
let value = ctx.arena.alloc_from_iter([ctx.expr_usize(sp, i)]); let value = ctx.arena.alloc_from_iter([ctx.expr_usize(sp, i)]);
ctx.expr_call_mut(sp, count_param, value) ctx.expr_call_mut(sp, count_param, value)
} else { } else {
ctx.expr(sp, hir::ExprKind::Err) ctx.expr(
sp,
hir::ExprKind::Err(
ctx.tcx.sess.delay_span_bug(sp, "lowered bad format_args count"),
),
)
} }
} }
None => ctx.expr_lang_item_type_relative(sp, hir::LangItem::FormatCount, sym::Implied), None => ctx.expr_lang_item_type_relative(sp, hir::LangItem::FormatCount, sym::Implied),
@ -135,7 +140,10 @@ fn make_format_spec<'hir>(
argmap.insert_full((arg_index, ArgumentType::Format(placeholder.format_trait))); argmap.insert_full((arg_index, ArgumentType::Format(placeholder.format_trait)));
ctx.expr_usize(sp, i) ctx.expr_usize(sp, i)
} }
Err(_) => ctx.expr(sp, hir::ExprKind::Err), Err(_) => ctx.expr(
sp,
hir::ExprKind::Err(ctx.tcx.sess.delay_span_bug(sp, "lowered bad format_args count")),
),
}; };
let &FormatOptions { let &FormatOptions {
ref width, ref width,
@ -294,7 +302,12 @@ fn expand_format_args<'hir>(
)); ));
make_argument(ctx, sp, arg, ty) make_argument(ctx, sp, arg, ty)
} else { } else {
ctx.expr(macsp, hir::ExprKind::Err) ctx.expr(
macsp,
hir::ExprKind::Err(
ctx.tcx.sess.delay_span_bug(macsp, format!("no arg at {arg_index}")),
),
)
} }
})); }));
let elements: Vec<_> = arguments let elements: Vec<_> = arguments

View file

@ -7,6 +7,7 @@ use rustc_ast::ptr::P;
use rustc_ast::visit::AssocCtxt; use rustc_ast::visit::AssocCtxt;
use rustc_ast::*; use rustc_ast::*;
use rustc_data_structures::sorted_map::SortedMap; use rustc_data_structures::sorted_map::SortedMap;
use rustc_errors::ErrorGuaranteed;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::{DefKind, Res}; use rustc_hir::def::{DefKind, Res};
use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID}; use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID};
@ -796,8 +797,8 @@ impl<'hir> LoweringContext<'_, 'hir> {
} }
/// Construct `ExprKind::Err` for the given `span`. /// Construct `ExprKind::Err` for the given `span`.
pub(crate) fn expr_err(&mut self, span: Span) -> hir::Expr<'hir> { pub(crate) fn expr_err(&mut self, span: Span, guar: ErrorGuaranteed) -> hir::Expr<'hir> {
self.expr(span, hir::ExprKind::Err) self.expr(span, hir::ExprKind::Err(guar))
} }
fn lower_impl_item(&mut self, i: &AssocItem) -> &'hir hir::ImplItem<'hir> { fn lower_impl_item(&mut self, i: &AssocItem) -> &'hir hir::ImplItem<'hir> {
@ -975,7 +976,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
fn lower_block_expr_opt(&mut self, span: Span, block: Option<&Block>) -> hir::Expr<'hir> { fn lower_block_expr_opt(&mut self, span: Span, block: Option<&Block>) -> hir::Expr<'hir> {
match block { match block {
Some(block) => self.lower_block_expr(block), Some(block) => self.lower_block_expr(block),
None => self.expr_err(span), None => self.expr_err(span, self.tcx.sess.delay_span_bug(span, "no block")),
} }
} }
@ -985,7 +986,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
&[], &[],
match expr { match expr {
Some(expr) => this.lower_expr_mut(expr), Some(expr) => this.lower_expr_mut(expr),
None => this.expr_err(span), None => this.expr_err(span, this.tcx.sess.delay_span_bug(span, "no block")),
}, },
) )
}) })

View file

@ -330,8 +330,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
ExprKind::Path(..) if allow_paths => {} ExprKind::Path(..) if allow_paths => {}
ExprKind::Unary(UnOp::Neg, inner) if matches!(inner.kind, ExprKind::Lit(_)) => {} ExprKind::Unary(UnOp::Neg, inner) if matches!(inner.kind, ExprKind::Lit(_)) => {}
_ => { _ => {
self.tcx.sess.emit_err(ArbitraryExpressionInPattern { span: expr.span }); let guar = self.tcx.sess.emit_err(ArbitraryExpressionInPattern { span: expr.span });
return self.arena.alloc(self.expr_err(expr.span)); return self.arena.alloc(self.expr_err(expr.span, guar));
} }
} }
self.lower_expr(expr) self.lower_expr(expr)

View file

@ -1688,7 +1688,7 @@ impl Expr<'_> {
ExprKind::Struct(..) => ExprPrecedence::Struct, ExprKind::Struct(..) => ExprPrecedence::Struct,
ExprKind::Repeat(..) => ExprPrecedence::Repeat, ExprKind::Repeat(..) => ExprPrecedence::Repeat,
ExprKind::Yield(..) => ExprPrecedence::Yield, ExprKind::Yield(..) => ExprPrecedence::Yield,
ExprKind::Err => ExprPrecedence::Err, ExprKind::Err(_) => ExprPrecedence::Err,
} }
} }
@ -1754,7 +1754,7 @@ impl Expr<'_> {
| ExprKind::Yield(..) | ExprKind::Yield(..)
| ExprKind::Cast(..) | ExprKind::Cast(..)
| ExprKind::DropTemps(..) | ExprKind::DropTemps(..)
| ExprKind::Err => false, | ExprKind::Err(_) => false,
} }
} }
@ -1840,7 +1840,7 @@ impl Expr<'_> {
| ExprKind::Binary(..) | ExprKind::Binary(..)
| ExprKind::Yield(..) | ExprKind::Yield(..)
| ExprKind::DropTemps(..) | ExprKind::DropTemps(..)
| ExprKind::Err => true, | ExprKind::Err(_) => true,
} }
} }
@ -2013,7 +2013,7 @@ pub enum ExprKind<'hir> {
Yield(&'hir Expr<'hir>, YieldSource), Yield(&'hir Expr<'hir>, YieldSource),
/// A placeholder for an expression that wasn't syntactically well formed in some way. /// A placeholder for an expression that wasn't syntactically well formed in some way.
Err, Err(rustc_span::ErrorGuaranteed),
} }
/// Represents an optionally `Self`-qualified value/type path or associated extension. /// Represents an optionally `Self`-qualified value/type path or associated extension.

View file

@ -790,7 +790,7 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr<'v>)
ExprKind::Yield(ref subexpression, _) => { ExprKind::Yield(ref subexpression, _) => {
visitor.visit_expr(subexpression); visitor.visit_expr(subexpression);
} }
ExprKind::Lit(_) | ExprKind::Err => {} ExprKind::Lit(_) | ExprKind::Err(_) => {}
} }
} }

View file

@ -1559,7 +1559,7 @@ impl<'a> State<'a> {
self.word_space("yield"); self.word_space("yield");
self.print_expr_maybe_paren(expr, parser::PREC_JUMP); self.print_expr_maybe_paren(expr, parser::PREC_JUMP);
} }
hir::ExprKind::Err => { hir::ExprKind::Err(_) => {
self.popen(); self.popen();
self.word("/*ERROR*/"); self.word("/*ERROR*/");
self.pclose(); self.pclose();

View file

@ -354,7 +354,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
ExprKind::Field(base, field) => self.check_field(expr, &base, field, expected), ExprKind::Field(base, field) => self.check_field(expr, &base, field, expected),
ExprKind::Index(base, idx) => self.check_expr_index(base, idx, expr), ExprKind::Index(base, idx) => self.check_expr_index(base, idx, expr),
ExprKind::Yield(value, ref src) => self.check_expr_yield(value, expr, src), ExprKind::Yield(value, ref src) => self.check_expr_yield(value, expr, src),
hir::ExprKind::Err => tcx.ty_error_misc(), hir::ExprKind::Err(guar) => tcx.ty_error(guar),
} }
} }

View file

@ -301,7 +301,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
hir::ExprKind::Continue(..) hir::ExprKind::Continue(..)
| hir::ExprKind::Lit(..) | hir::ExprKind::Lit(..)
| hir::ExprKind::ConstBlock(..) | hir::ExprKind::ConstBlock(..)
| hir::ExprKind::Err => {} | hir::ExprKind::Err(_) => {}
hir::ExprKind::Loop(blk, ..) => { hir::ExprKind::Loop(blk, ..) => {
self.walk_block(blk); self.walk_block(blk);

View file

@ -219,7 +219,7 @@ impl<'a, 'tcx> DropRangeVisitor<'a, 'tcx> {
| ExprKind::Struct(..) | ExprKind::Struct(..)
| ExprKind::Repeat(..) | ExprKind::Repeat(..)
| ExprKind::Yield(..) | ExprKind::Yield(..)
| ExprKind::Err => (), | ExprKind::Err(_) => (),
} }
} }
@ -483,7 +483,7 @@ impl<'a, 'tcx> Visitor<'tcx> for DropRangeVisitor<'a, 'tcx> {
| ExprKind::Closure { .. } | ExprKind::Closure { .. }
| ExprKind::ConstBlock(..) | ExprKind::ConstBlock(..)
| ExprKind::DropTemps(..) | ExprKind::DropTemps(..)
| ExprKind::Err | ExprKind::Err(_)
| ExprKind::Field(..) | ExprKind::Field(..)
| ExprKind::Index(..) | ExprKind::Index(..)
| ExprKind::InlineAsm(..) | ExprKind::InlineAsm(..)

View file

@ -383,7 +383,7 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> {
| hir::ExprKind::Repeat(..) | hir::ExprKind::Repeat(..)
| hir::ExprKind::InlineAsm(..) | hir::ExprKind::InlineAsm(..)
| hir::ExprKind::Box(..) | hir::ExprKind::Box(..)
| hir::ExprKind::Err => Ok(self.cat_rvalue(expr.hir_id, expr.span, expr_ty)), | hir::ExprKind::Err(_) => Ok(self.cat_rvalue(expr.hir_id, expr.span, expr_ty)),
} }
} }

View file

@ -758,7 +758,7 @@ impl<'tcx> Cx<'tcx> {
hir::ExprKind::Tup(ref fields) => ExprKind::Tuple { fields: self.mirror_exprs(fields) }, hir::ExprKind::Tup(ref fields) => ExprKind::Tuple { fields: self.mirror_exprs(fields) },
hir::ExprKind::Yield(ref v, _) => ExprKind::Yield { value: self.mirror_expr(v) }, hir::ExprKind::Yield(ref v, _) => ExprKind::Yield { value: self.mirror_expr(v) },
hir::ExprKind::Err => unreachable!(), hir::ExprKind::Err(_) => unreachable!(),
}; };
Expr { temp_lifetime, ty: expr_ty, span: expr.span, kind } Expr { temp_lifetime, ty: expr_ty, span: expr.span, kind }

View file

@ -475,7 +475,7 @@ impl<'tcx> Visitor<'tcx> for IrMaps<'tcx> {
| hir::ExprKind::InlineAsm(..) | hir::ExprKind::InlineAsm(..)
| hir::ExprKind::Box(..) | hir::ExprKind::Box(..)
| hir::ExprKind::Type(..) | hir::ExprKind::Type(..)
| hir::ExprKind::Err | hir::ExprKind::Err(_)
| hir::ExprKind::Path(hir::QPath::TypeRelative(..)) | hir::ExprKind::Path(hir::QPath::TypeRelative(..))
| hir::ExprKind::Path(hir::QPath::LangItem(..)) => { | hir::ExprKind::Path(hir::QPath::LangItem(..)) => {
intravisit::walk_expr(self, expr); intravisit::walk_expr(self, expr);
@ -1129,7 +1129,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
hir::ExprKind::Lit(..) hir::ExprKind::Lit(..)
| hir::ExprKind::ConstBlock(..) | hir::ExprKind::ConstBlock(..)
| hir::ExprKind::Err | hir::ExprKind::Err(_)
| hir::ExprKind::Path(hir::QPath::TypeRelative(..)) | hir::ExprKind::Path(hir::QPath::TypeRelative(..))
| hir::ExprKind::Path(hir::QPath::LangItem(..)) => succ, | hir::ExprKind::Path(hir::QPath::LangItem(..)) => succ,
@ -1427,7 +1427,7 @@ fn check_expr<'tcx>(this: &mut Liveness<'_, 'tcx>, expr: &'tcx Expr<'tcx>) {
| hir::ExprKind::Yield(..) | hir::ExprKind::Yield(..)
| hir::ExprKind::Box(..) | hir::ExprKind::Box(..)
| hir::ExprKind::Type(..) | hir::ExprKind::Type(..)
| hir::ExprKind::Err => {} | hir::ExprKind::Err(_) => {}
} }
} }

View file

@ -219,7 +219,7 @@ impl<'tcx> CheckInlineAssembly<'tcx> {
hir::intravisit::walk_expr(self, expr); hir::intravisit::walk_expr(self, expr);
} }
ExprKind::Err => { ExprKind::Err(_) => {
self.items.push((ItemKind::Err, span)); self.items.push((ItemKind::Err, span));
} }
} }