Skip to content

Make it a bit easier to debug TyKind::Error errors #70245

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/librustc/lib.rs
Original file line number Diff line number Diff line change
@@ -50,6 +50,7 @@
#![feature(rustc_attrs)]
#![feature(hash_raw_entry)]
#![feature(int_error_matching)]
#![feature(track_caller)]
#![recursion_limit = "512"]

#[macro_use]
16 changes: 12 additions & 4 deletions src/librustc/middle/stability.rs
Original file line number Diff line number Diff line change
@@ -30,7 +30,11 @@ pub enum StabilityLevel {

impl StabilityLevel {
pub fn from_attr_level(level: &attr::StabilityLevel) -> Self {
if level.is_stable() { Stable } else { Unstable }
if level.is_stable() {
Stable
} else {
Unstable
}
}
}

@@ -110,7 +114,11 @@ pub fn report_unstable(
let span_key = msp.primary_span().and_then(|sp: Span| {
if !sp.is_dummy() {
let file = sm.lookup_char_pos(sp.lo()).file;
if file.is_imported() { None } else { Some(span) }
if file.is_imported() {
None
} else {
Some(span)
}
} else {
None
}
@@ -227,7 +235,7 @@ fn late_report_deprecation(
if let hir::Node::Expr(_) = tcx.hir().get(hir_id) {
deprecation_suggestion(&mut diag, suggestion, span);
}
diag.emit()
diag.emit();
});
if hir_id == hir::DUMMY_HIR_ID {
span_bug!(span, "emitted a {} lint with dummy HIR id: {:?}", lint.name, def_id);
@@ -391,7 +399,7 @@ impl<'tcx> TyCtxt<'tcx> {
pub fn check_stability(self, def_id: DefId, id: Option<HirId>, span: Span) {
let soft_handler = |lint, span, msg: &_| {
self.struct_span_lint_hir(lint, id.unwrap_or(hir::CRATE_HIR_ID), span, |lint| {
lint.build(msg).emit()
lint.build(msg).emit();
})
};
match self.eval_stability(def_id, id, span) {
4 changes: 3 additions & 1 deletion src/librustc/mir/interpret/error.rs
Original file line number Diff line number Diff line change
@@ -89,7 +89,9 @@ impl<'tcx> ConstEvalErr<'tcx> {
}

pub fn report_as_error(&self, tcx: TyCtxtAt<'tcx>, message: &str) -> ErrorHandled {
match self.struct_error(tcx, message, |mut e| e.emit()) {
match self.struct_error(tcx, message, |mut e| {
e.emit();
}) {
Ok(_) => ErrorHandled::Reported,
Err(x) => x,
}
2 changes: 1 addition & 1 deletion src/librustc/traits/query.rs
Original file line number Diff line number Diff line change
@@ -221,7 +221,7 @@ pub fn trivial_dropck_outlives<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> bool {
| ty::Ref(..)
| ty::Str
| ty::Foreign(..)
| ty::Error => true,
| ty::Error(..) => true,

// [T; N] and [T] have same properties as T.
ty::Array(ty, _) | ty::Slice(ty) => trivial_dropck_outlives(tcx, ty),
8 changes: 4 additions & 4 deletions src/librustc/traits/specialization_graph.rs
Original file line number Diff line number Diff line change
@@ -32,12 +32,12 @@ pub struct Graph {
pub children: DefIdMap<Children>,

/// Whether an error was emitted while constructing the graph.
pub has_errored: bool,
pub error_reported: Option<ErrorReported>,
}

impl Graph {
pub fn new() -> Graph {
Graph { parent: Default::default(), children: Default::default(), has_errored: false }
Graph { parent: Default::default(), children: Default::default(), error_reported: None }
}

/// The parent of a given impl, which is the `DefId` of the trait when the
@@ -191,8 +191,8 @@ pub fn ancestors(
start_from_impl: DefId,
) -> Result<Ancestors<'tcx>, ErrorReported> {
let specialization_graph = tcx.specialization_graph_of(trait_def_id);
if specialization_graph.has_errored {
Err(ErrorReported)
if let Some(error_reported) = specialization_graph.error_reported {
Err(error_reported)
} else {
Ok(Ancestors {
trait_def_id,
2 changes: 1 addition & 1 deletion src/librustc/ty/_match.rs
Original file line number Diff line number Diff line change
@@ -76,7 +76,7 @@ impl TypeRelation<'tcx> for Match<'tcx> {
Err(TypeError::Sorts(relate::expected_found(self, &a, &b)))
}

(&ty::Error, _) | (_, &ty::Error) => Ok(self.tcx().types.err),
(&ty::Error(proof), _) | (_, &ty::Error(proof)) => Ok(self.tcx().err(proof)),

_ => relate::super_relate_tys(self, a, b),
}
54 changes: 29 additions & 25 deletions src/librustc/ty/context.rs
Original file line number Diff line number Diff line change
@@ -164,7 +164,6 @@ pub struct CommonTypes<'tcx> {
pub f64: Ty<'tcx>,
pub never: Ty<'tcx>,
pub self_param: Ty<'tcx>,
pub err: Ty<'tcx>,

/// Dummy type used for the `Self` of a `TraitRef` created for converting
/// a trait object, and which gets removed in `ExistentialTraitRef`.
@@ -183,10 +182,6 @@ pub struct CommonLifetimes<'tcx> {
pub re_erased: Region<'tcx>,
}

pub struct CommonConsts<'tcx> {
pub err: &'tcx Const<'tcx>,
}

pub struct LocalTableInContext<'a, V> {
hir_owner: Option<LocalDefId>,
data: &'a ItemLocalMap<V>,
@@ -821,7 +816,6 @@ impl<'tcx> CommonTypes<'tcx> {
bool: mk(Bool),
char: mk(Char),
never: mk(Never),
err: mk(Error),
isize: mk(Int(ast::IntTy::Isize)),
i8: mk(Int(ast::IntTy::I8)),
i16: mk(Int(ast::IntTy::I16)),
@@ -855,19 +849,6 @@ impl<'tcx> CommonLifetimes<'tcx> {
}
}

impl<'tcx> CommonConsts<'tcx> {
fn new(interners: &CtxtInterners<'tcx>, types: &CommonTypes<'tcx>) -> CommonConsts<'tcx> {
let mk_const = |c| interners.const_.intern(c, |c| Interned(interners.arena.alloc(c))).0;

CommonConsts {
err: mk_const(ty::Const {
val: ty::ConstKind::Value(ConstValue::Scalar(Scalar::zst())),
ty: types.err,
}),
}
}
}

// This struct contains information regarding the `ReFree(FreeRegion)` corresponding to a lifetime
// conflict.
#[derive(Debug)]
@@ -925,9 +906,6 @@ pub struct GlobalCtxt<'tcx> {
/// Common lifetimes, pre-interned for your convenience.
pub lifetimes: CommonLifetimes<'tcx>,

/// Common consts, pre-interned for your convenience.
pub consts: CommonConsts<'tcx>,

/// Resolutions of `extern crate` items produced by resolver.
extern_crate_map: NodeMap<CrateNum>,

@@ -992,6 +970,34 @@ pub struct GlobalCtxt<'tcx> {
}

impl<'tcx> TyCtxt<'tcx> {
/// Construct an `Error` type. This requires proof that an error has already been emited or
/// will be emited.
#[track_caller]
#[inline]
pub fn err(self, proof: rustc_errors::ErrorProof) -> Ty<'tcx> {
self.sess.diagnostic().delay_span_bug(
rustc_span::DUMMY_SP,
&format!("Error constructed but not emited {}", std::panic::Location::caller()),
);
self.mk_ty(Error(proof))
}

/// Construct an error `const`. This requires proof that an error has already been emited or
/// will be emited.
#[track_caller]
#[inline]
pub fn const_err(self, proof: rustc_errors::ErrorProof) -> Const<'tcx> {
self.sess.diagnostic().delay_span_bug(
rustc_span::DUMMY_SP,
&format!("Error `const` constructed but not emited {}", std::panic::Location::caller()),
);

*self.mk_const(ty::Const {
val: ty::ConstKind::Value(ConstValue::Scalar(Scalar::zst())),
ty: self.err(proof),
})
}

pub fn alloc_steal_mir(self, mir: BodyAndCache<'tcx>) -> &'tcx Steal<BodyAndCache<'tcx>> {
self.arena.alloc(Steal::new(mir))
}
@@ -1096,7 +1102,6 @@ impl<'tcx> TyCtxt<'tcx> {
let interners = CtxtInterners::new(arena);
let common_types = CommonTypes::new(&interners);
let common_lifetimes = CommonLifetimes::new(&interners);
let common_consts = CommonConsts::new(&interners, &common_types);
let cstore = resolutions.cstore;
let crates = cstore.crates_untracked();
let max_cnum = crates.iter().map(|c| c.as_usize()).max().unwrap_or(0);
@@ -1146,7 +1151,6 @@ impl<'tcx> TyCtxt<'tcx> {
prof: s.prof.clone(),
types: common_types,
lifetimes: common_lifetimes,
consts: common_consts,
extern_crate_map: resolutions.extern_crate_map,
trait_map,
export_map: resolutions
@@ -1840,7 +1844,7 @@ macro_rules! sty_debug_print {
let variant = match t.kind {
ty::Bool | ty::Char | ty::Int(..) | ty::Uint(..) |
ty::Float(..) | ty::Str | ty::Never => continue,
ty::Error => /* unimportant */ continue,
ty::Error(..) => /* unimportant */ continue,
$(ty::$variant(..) => &mut $variant,)*
};
let lt = t.flags.intersects(ty::TypeFlags::HAS_RE_INFER);
4 changes: 2 additions & 2 deletions src/librustc/ty/error.rs
Original file line number Diff line number Diff line change
@@ -275,14 +275,14 @@ impl<'tcx> ty::TyS<'tcx> {
ty::UnnormalizedProjection(_) => "non-normalized associated type".into(),
ty::Param(p) => format!("type parameter `{}`", p).into(),
ty::Opaque(..) => "opaque type".into(),
ty::Error => "type error".into(),
ty::Error(..) => "type error".into(),
}
}

pub fn prefix_string(&self) -> Cow<'static, str> {
match self.kind {
ty::Infer(_)
| ty::Error
| ty::Error(..)
| ty::Bool
| ty::Char
| ty::Int(_)
2 changes: 1 addition & 1 deletion src/librustc/ty/fast_reject.rs
Original file line number Diff line number Diff line change
@@ -105,7 +105,7 @@ pub fn simplify_type(
}
ty::Opaque(def_id, _) => Some(OpaqueSimplifiedType(def_id)),
ty::Foreign(def_id) => Some(ForeignSimplifiedType(def_id)),
ty::Placeholder(..) | ty::Bound(..) | ty::Infer(_) | ty::Error => None,
ty::Placeholder(..) | ty::Bound(..) | ty::Infer(_) | ty::Error(..) => None,
}
}

2 changes: 1 addition & 1 deletion src/librustc/ty/flags.rs
Original file line number Diff line number Diff line change
@@ -77,7 +77,7 @@ impl FlagComputation {
// But doing so caused sporadic memory corruption, and
// neither I (tjc) nor nmatsakis could figure out why,
// so we're doing it this way.
&ty::Error => self.add_flags(TypeFlags::HAS_TY_ERR),
&ty::Error(..) => self.add_flags(TypeFlags::HAS_TY_ERR),

&ty::Param(_) => {
self.add_flags(TypeFlags::HAS_TY_PARAM);
4 changes: 2 additions & 2 deletions src/librustc/ty/layout.rs
Original file line number Diff line number Diff line change
@@ -1249,7 +1249,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
| ty::GeneratorWitness(..)
| ty::Infer(_) => bug!("LayoutDetails::compute: unexpected type `{}`", ty),

ty::Param(_) | ty::Error => {
ty::Param(_) | ty::Error(..) => {
return Err(LayoutError::Unknown(ty));
}
})
@@ -2144,7 +2144,7 @@ where
| ty::Opaque(..)
| ty::Param(_)
| ty::Infer(_)
| ty::Error => bug!("TyLayout::field_type: unexpected type `{}`", this.ty),
| ty::Error(..) => bug!("TyLayout::field_type: unexpected type `{}`", this.ty),
})
}

2 changes: 1 addition & 1 deletion src/librustc/ty/outlives.rs
Original file line number Diff line number Diff line change
@@ -147,7 +147,7 @@ fn compute_components(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>, out: &mut SmallVec<[Compo
ty::Dynamic(..) | // OutlivesObject, OutlivesFragment (*)
ty::Placeholder(..) |
ty::Bound(..) |
ty::Error => {
ty::Error(..) => {
// (*) Bare functions and traits are both binders. In the
// RFC, this means we would add the bound regions to the
// "bound regions list". In our representation, no such
2 changes: 1 addition & 1 deletion src/librustc/ty/print/mod.rs
Original file line number Diff line number Diff line change
@@ -299,7 +299,7 @@ pub fn characteristic_def_id_of_type(ty: Ty<'_>) -> Option<DefId> {
| ty::Opaque(..)
| ty::Infer(_)
| ty::Bound(..)
| ty::Error
| ty::Error(..)
| ty::GeneratorWitness(..)
| ty::Never
| ty::Float(_) => None,
2 changes: 1 addition & 1 deletion src/librustc/ty/print/obsolete.rs
Original file line number Diff line number Diff line change
@@ -144,7 +144,7 @@ impl DefPathBasedNames<'tcx> {
let substs = substs.truncate_to(self.tcx, generics);
self.push_generic_params(substs, iter::empty(), output, debug);
}
ty::Error
ty::Error(..)
| ty::Bound(..)
| ty::Infer(_)
| ty::Placeholder(..)
2 changes: 1 addition & 1 deletion src/librustc/ty/print/pretty.rs
Original file line number Diff line number Diff line change
@@ -530,7 +530,7 @@ pub trait PrettyPrinter<'tcx>:
p!(write("{}", infer_ty))
}
}
ty::Error => p!(write("[type error]")),
ty::Error(..) => p!(write("[type error]")),
ty::Param(ref param_ty) => p!(write("{}", param_ty)),
ty::Bound(debruijn, bound_ty) => match bound_ty.kind {
ty::BoundTyKind::Anon => self.pretty_print_bound_var(debruijn, bound_ty.var)?,
8 changes: 4 additions & 4 deletions src/librustc/ty/query/plumbing.rs
Original file line number Diff line number Diff line change
@@ -804,17 +804,17 @@ impl<'tcx> TyCtxt<'tcx> {

macro_rules! handle_cycle_error {
([][$tcx: expr, $error:expr]) => {{
$tcx.report_cycle($error).emit();
Value::from_cycle_error($tcx)
let proof = $tcx.report_cycle($error).emit().proof();
Value::from_cycle_error($tcx, proof)
}};
([fatal_cycle $($rest:tt)*][$tcx:expr, $error:expr]) => {{
$tcx.report_cycle($error).emit();
$tcx.sess.abort_if_errors();
unreachable!()
}};
([cycle_delay_bug $($rest:tt)*][$tcx:expr, $error:expr]) => {{
$tcx.report_cycle($error).delay_as_bug();
Value::from_cycle_error($tcx)
let proof = $tcx.report_cycle($error).delay_as_bug();
Value::from_cycle_error($tcx, proof)
}};
([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*][$($args:tt)*]) => {
handle_cycle_error!([$($($modifiers)*)*][$($args)*])
15 changes: 8 additions & 7 deletions src/librustc/ty/query/values.rs
Original file line number Diff line number Diff line change
@@ -1,32 +1,33 @@
use crate::ty::{self, AdtSizedConstraint, Ty, TyCtxt};

use rustc_errors::ErrorProof;
use rustc_span::symbol::Symbol;

pub(super) trait Value<'tcx>: Sized {
fn from_cycle_error(tcx: TyCtxt<'tcx>) -> Self;
fn from_cycle_error(tcx: TyCtxt<'tcx>, proof: ErrorProof) -> Self;
}

impl<'tcx, T> Value<'tcx> for T {
default fn from_cycle_error(tcx: TyCtxt<'tcx>) -> T {
default fn from_cycle_error(tcx: TyCtxt<'tcx>, _: ErrorProof) -> T {
tcx.sess.abort_if_errors();
bug!("Value::from_cycle_error called without errors");
}
}

impl<'tcx> Value<'tcx> for Ty<'tcx> {
fn from_cycle_error(tcx: TyCtxt<'tcx>) -> Ty<'tcx> {
tcx.types.err
fn from_cycle_error(tcx: TyCtxt<'tcx>, proof: ErrorProof) -> Ty<'tcx> {
tcx.err(proof)
}
}

impl<'tcx> Value<'tcx> for ty::SymbolName {
fn from_cycle_error(_: TyCtxt<'tcx>) -> Self {
fn from_cycle_error(_: TyCtxt<'tcx>, _: ErrorProof) -> Self {
ty::SymbolName { name: Symbol::intern("<error>") }
}
}

impl<'tcx> Value<'tcx> for AdtSizedConstraint<'tcx> {
fn from_cycle_error(tcx: TyCtxt<'tcx>) -> Self {
AdtSizedConstraint(tcx.intern_type_list(&[tcx.types.err]))
fn from_cycle_error(tcx: TyCtxt<'tcx>, proof: ErrorProof) -> Self {
AdtSizedConstraint(tcx.intern_type_list(&[tcx.err(proof)]))
}
}
2 changes: 1 addition & 1 deletion src/librustc/ty/relate.rs
Original file line number Diff line number Diff line change
@@ -354,7 +354,7 @@ pub fn super_relate_tys<R: TypeRelation<'tcx>>(
bug!("bound types encountered in super_relate_tys")
}

(&ty::Error, _) | (_, &ty::Error) => Ok(tcx.types.err),
(&ty::Error(proof), _) | (_, &ty::Error(proof)) => Ok(tcx.err(proof)),

(&ty::Never, _)
| (&ty::Char, _)
Loading