Skip to content

Commit

Permalink
Add new error codes in librustc_typeck
Browse files Browse the repository at this point in the history
  • Loading branch information
GuillaumeGomez authored and arielb1 committed Jul 22, 2016
1 parent 93a9683 commit e76a46a
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 10 deletions.
19 changes: 14 additions & 5 deletions src/librustc/infer/mod.rs
Expand Up @@ -1510,26 +1510,35 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
self.type_error_struct(sp, mk_msg, actual_ty).emit();
}

// FIXME: this results in errors without an error code. Deprecate?
pub fn type_error_struct<M>(&self,
sp: Span,
mk_msg: M,
actual_ty: Ty<'tcx>)
-> DiagnosticBuilder<'tcx>
where M: FnOnce(String) -> String,
{
debug!("type_error_struct({:?}, {:?})", sp, actual_ty);
self.type_error_struct_with_diag(sp, |actual_ty| {
self.tcx.sess.struct_span_err(sp, &mk_msg(actual_ty))
}, actual_ty)
}

pub fn type_error_struct_with_diag<M>(&self,
sp: Span,
mk_diag: M,
actual_ty: Ty<'tcx>)
-> DiagnosticBuilder<'tcx>
where M: FnOnce(String) -> DiagnosticBuilder<'tcx>,
{
let actual_ty = self.resolve_type_vars_if_possible(&actual_ty);
debug!("type_error_struct_with_diag({:?}, {:?})", sp, actual_ty);

// Don't report an error if actual type is TyError.
if actual_ty.references_error() {
return self.tcx.sess.diagnostic().struct_dummy();
}

let msg = mk_msg(self.ty_to_string(actual_ty));

// FIXME: use an error code.
self.tcx.sess.struct_span_err(sp, &msg)
mk_diag(self.ty_to_string(actual_ty))
}

pub fn report_mismatched_types(&self,
Expand Down
12 changes: 7 additions & 5 deletions src/librustc_typeck/check/mod.rs
Expand Up @@ -3028,14 +3028,16 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
variant: ty::VariantDef<'tcx>,
field: &hir::Field,
skip_fields: &[hir::Field]) {
let mut err = self.type_error_struct(
let mut err = self.type_error_struct_with_diag(
field.name.span,
|actual| if let ty::TyEnum(..) = ty.sty {
format!("struct variant `{}::{}` has no field named `{}`",
actual, variant.name.as_str(), field.name.node)
struct_span_err!(self.tcx.sess, field.name.span, E0559,
"struct variant `{}::{}` has no field named `{}`",
actual, variant.name.as_str(), field.name.node)
} else {
format!("structure `{}` has no field named `{}`",
actual, field.name.node)
struct_span_err!(self.tcx.sess, field.name.span, E0560,
"structure `{}` has no field named `{}`",
actual, field.name.node)
},
ty);
// prevent all specified fields from being suggested
Expand Down
2 changes: 2 additions & 0 deletions src/librustc_typeck/diagnostics.rs
Expand Up @@ -4053,4 +4053,6 @@ register_diagnostics! {
E0528, // expected at least {} elements, found {}
E0529, // slice pattern expects array or slice, not `{}`
E0533, // `{}` does not name a unit variant, unit struct or a constant
E0559,
E0560,
}

0 comments on commit e76a46a

Please sign in to comment.