Detect a traits being used as structs in check_expr_with_unifier

Fixes #16750
Fixes #15812
This commit is contained in:
wickerwaka 2014-08-29 19:24:06 -07:00
parent 5419b2ca2c
commit f5776f81fd
2 changed files with 32 additions and 12 deletions

View File

@ -169,5 +169,6 @@ register_diagnostics!(
E0155,
E0156,
E0157,
E0158
E0158,
E0159
)

View File

@ -3463,6 +3463,22 @@ fn check_expr_with_unifier(fcx: &FnCtxt,
fcx.write_ty(id, enum_type);
}
fn check_struct_fields_on_error(fcx: &FnCtxt,
id: ast::NodeId,
fields: &[ast::Field],
base_expr: Option<Gc<ast::Expr>>) {
// Make sure to still write the types
// otherwise we might ICE
fcx.write_error(id);
for field in fields.iter() {
check_expr(fcx, &*field.expr);
}
match base_expr {
Some(ref base) => check_expr(fcx, &**base),
None => {}
}
}
type ExprCheckerWithTy = fn(&FnCtxt, &ast::Expr, ty::t);
let tcx = fcx.ccx.tcx;
@ -3982,6 +3998,16 @@ fn check_expr_with_unifier(fcx: &FnCtxt,
variant_id, fields.as_slice());
enum_id
}
Some(def::DefTrait(def_id)) => {
span_err!(tcx.sess, path.span, E0159,
"`{}` is a trait not a structure",
pprust::path_to_string(path));
check_struct_fields_on_error(fcx,
id,
fields.as_slice(),
base_expr);
def_id
},
Some(def) => {
// Verify that this was actually a struct.
let typ = ty::lookup_item_type(fcx.ccx.tcx, def.def_id());
@ -3998,17 +4024,10 @@ fn check_expr_with_unifier(fcx: &FnCtxt,
span_err!(tcx.sess, path.span, E0071,
"`{}` does not name a structure",
pprust::path_to_string(path));
// Make sure to still write the types
// otherwise we might ICE
fcx.write_error(id);
for field in fields.iter() {
check_expr(fcx, &*field.expr);
}
match base_expr {
Some(ref base) => check_expr(fcx, &**base),
None => {}
}
check_struct_fields_on_error(fcx,
id,
fields.as_slice(),
base_expr);
}
}