Skip to content

Commit 029a9c6

Browse files
committedJan 16, 2020
review comments
1 parent 00e2626 commit 029a9c6

File tree

2 files changed

+24
-27
lines changed

2 files changed

+24
-27
lines changed
 

‎src/librustc/traits/error_reporting/suggestions.rs

+23-26
Original file line numberDiff line numberDiff line change
@@ -605,34 +605,31 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
605605

606606
let tables = self.in_progress_tables.map(|t| t.borrow()).unwrap();
607607

608-
let mut all_returns_conform_to_trait = true;
609-
let mut all_returns_have_same_type = true;
610-
let mut last_ty = None;
611-
if let Some(ty_ret_ty) = tables.node_type_opt(ret_ty.hir_id) {
612-
let cause = ObligationCause::misc(ret_ty.span, ret_ty.hir_id);
613-
let param_env = ty::ParamEnv::empty();
614-
if let ty::Dynamic(predicates, _) = &ty_ret_ty.kind {
615-
for expr in &visitor.0 {
616-
if let Some(returned_ty) = tables.node_type_opt(expr.hir_id) {
617-
all_returns_have_same_type &=
618-
Some(returned_ty) == last_ty || last_ty.is_none();
619-
last_ty = Some(returned_ty);
620-
for predicate in predicates.iter() {
621-
let pred = predicate.with_self_ty(self.tcx, returned_ty);
622-
let obl = Obligation::new(cause.clone(), param_env, pred);
623-
all_returns_conform_to_trait &= self.predicate_may_hold(&obl);
624-
}
608+
let mut ret_types = visitor.0.iter().filter_map(|expr| tables.node_type_opt(expr.hir_id));
609+
let (last_ty, all_returns_have_same_type) =
610+
ret_types.clone().fold((None, true), |(last_ty, mut same), returned_ty| {
611+
same &= last_ty.map_or(true, |ty| ty == returned_ty);
612+
(Some(returned_ty), same)
613+
});
614+
let all_returns_conform_to_trait =
615+
if let Some(ty_ret_ty) = tables.node_type_opt(ret_ty.hir_id) {
616+
match ty_ret_ty.kind {
617+
ty::Dynamic(predicates, _) => {
618+
let cause = ObligationCause::misc(ret_ty.span, ret_ty.hir_id);
619+
let param_env = ty::ParamEnv::empty();
620+
ret_types.all(|returned_ty| {
621+
predicates.iter().all(|predicate| {
622+
let pred = predicate.with_self_ty(self.tcx, returned_ty);
623+
let obl = Obligation::new(cause.clone(), param_env, pred);
624+
self.predicate_may_hold(&obl)
625+
})
626+
})
625627
}
628+
_ => true,
626629
}
627-
}
628-
} else {
629-
// We still want to verify whether all the return types conform to each other.
630-
for expr in &visitor.0 {
631-
let returned_ty = tables.node_type_opt(expr.hir_id);
632-
all_returns_have_same_type &= last_ty == returned_ty || last_ty.is_none();
633-
last_ty = returned_ty;
634-
}
635-
}
630+
} else {
631+
true
632+
};
636633

637634
let (snippet, last_ty) =
638635
if let (true, hir::TyKind::TraitObject(..), Ok(snippet), true, Some(last_ty)) = (

‎src/librustc_error_codes/error_codes/E0746.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ impl T for S {
1313
}
1414
1515
// Having the trait `T` as return type is invalid because
16-
// bare trait objects do not have a statically known size:
16+
// unboxed trait objects do not have a statically known size:
1717
fn foo() -> dyn T {
1818
S(42)
1919
}

0 commit comments

Comments
 (0)
Please sign in to comment.