Skip to content

Commit

Permalink
Suggest removing ? to resolve type errors.
Browse files Browse the repository at this point in the history
This commit adds a suggestion to remove the `?` from expressions if
removing the `?` would resolve a type error.
  • Loading branch information
davidtwco committed Apr 10, 2019
1 parent 77bdb35 commit 16592f6
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 4 deletions.
28 changes: 27 additions & 1 deletion src/librustc/infer/error_reporting/mod.rs
Expand Up @@ -604,13 +604,39 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
source,
ref prior_arms,
last_ty,
discrim_hir_id,
..
} => match source {
hir::MatchSource::IfLetDesugar { .. } => {
let msg = "`if let` arms have incompatible types";
err.span_label(cause.span, msg);
}
hir::MatchSource::TryDesugar => {}
hir::MatchSource::TryDesugar => {
if let Some(ty::error::ExpectedFound { expected, .. }) = exp_found {
let discrim_expr = self.tcx.hir().expect_expr_by_hir_id(discrim_hir_id);
let discrim_ty = if let hir::ExprKind::Call(_, args) = &discrim_expr.node {
let arg_expr = args.first().expect("try desugaring call w/out arg");
self.in_progress_tables.and_then(|tables| {
tables.borrow().expr_ty_opt(arg_expr)
})
} else {
bug!("try desugaring w/out call expr as discriminant");
};

match discrim_ty {
Some(ty) if expected == ty => {
let source_map = self.tcx.sess.source_map();
err.span_suggestion(
source_map.end_point(cause.span),
"try removing this `?`",
"".to_string(),
Applicability::MachineApplicable,
);
},
_ => {},
}
}
}
_ => {
let msg = "`match` arms have incompatible types";
err.span_label(cause.span, msg);
Expand Down
1 change: 1 addition & 0 deletions src/librustc/traits/mod.rs
Expand Up @@ -227,6 +227,7 @@ pub enum ObligationCauseCode<'tcx> {
source: hir::MatchSource,
prior_arms: Vec<Span>,
last_ty: Ty<'tcx>,
discrim_hir_id: hir::HirId,
},

/// Computing common supertype in the pattern guard for the arms of a match expression
Expand Down
2 changes: 2 additions & 0 deletions src/librustc/traits/structural_impls.rs
Expand Up @@ -519,13 +519,15 @@ impl<'a, 'tcx> Lift<'tcx> for traits::ObligationCauseCode<'a> {
source,
ref prior_arms,
last_ty,
discrim_hir_id,
} => {
tcx.lift(&last_ty).map(|last_ty| {
super::MatchExpressionArm {
arm_span,
source,
prior_arms: prior_arms.clone(),
last_ty,
discrim_hir_id,
}
})
}
Expand Down
1 change: 1 addition & 0 deletions src/librustc_typeck/check/_match.rs
Expand Up @@ -732,6 +732,7 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
source: match_src,
prior_arms: other_arms.clone(),
last_ty: prior_arm_ty.unwrap(),
discrim_hir_id: discrim.hir_id,
})
};
coercion.coerce(self, &cause, &arm.body, arm_ty);
Expand Down
17 changes: 17 additions & 0 deletions src/test/ui/issue-59756.fixed
@@ -0,0 +1,17 @@
// run-rustfix

#![allow(warnings)]

struct A;
struct B;

fn foo() -> Result<A, B> {
Ok(A)
}

fn bar() -> Result<A, B> {
foo()
//~^ ERROR try expression alternatives have incompatible types [E0308]
}

fn main() {}
2 changes: 2 additions & 0 deletions src/test/ui/issue-59756.rs
@@ -1,3 +1,5 @@
// run-rustfix

#![allow(warnings)]

struct A;
Expand Down
7 changes: 5 additions & 2 deletions src/test/ui/issue-59756.stderr
@@ -1,8 +1,11 @@
error[E0308]: try expression alternatives have incompatible types
--> $DIR/issue-59756.rs:11:5
--> $DIR/issue-59756.rs:13:5
|
LL | foo()?
| ^^^^^^ expected enum `std::result::Result`, found struct `A`
| ^^^^^-
| | |
| | help: try removing this `?`
| expected enum `std::result::Result`, found struct `A`
|
= note: expected type `std::result::Result<A, B>`
found type `A`
Expand Down
Expand Up @@ -2,7 +2,10 @@ error[E0308]: try expression alternatives have incompatible types
--> $DIR/issue-51632-try-desugar-incompatible-types.rs:8:5
|
LL | missing_discourses()?
| ^^^^^^^^^^^^^^^^^^^^^ expected enum `std::result::Result`, found isize
| ^^^^^^^^^^^^^^^^^^^^-
| | |
| | help: try removing this `?`
| expected enum `std::result::Result`, found isize
|
= note: expected type `std::result::Result<isize, ()>`
found type `isize`
Expand Down

0 comments on commit 16592f6

Please sign in to comment.