Introduce Diverges::always constructor
Rename the existing Diverges.always method to Diverges.is_always
This commit is contained in:
parent
6edcfbe59a
commit
a8ce93e13a
3 changed files with 15 additions and 11 deletions
|
@ -43,10 +43,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
|
|
||||||
// If there are no arms, that is a diverging match; a special case.
|
// If there are no arms, that is a diverging match; a special case.
|
||||||
if arms.is_empty() {
|
if arms.is_empty() {
|
||||||
self.diverges.set(self.diverges.get() | Diverges::Always {
|
self.diverges.set(self.diverges.get() | Diverges::always(expr.span));
|
||||||
span: expr.span,
|
|
||||||
custom_note: None
|
|
||||||
});
|
|
||||||
return tcx.types.never;
|
return tcx.types.never;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,7 +195,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
/// When the previously checked expression (the scrutinee) diverges,
|
/// When the previously checked expression (the scrutinee) diverges,
|
||||||
/// warn the user about the match arms being unreachable.
|
/// warn the user about the match arms being unreachable.
|
||||||
fn warn_arms_when_scrutinee_diverges(&self, arms: &'tcx [hir::Arm], source: hir::MatchSource) {
|
fn warn_arms_when_scrutinee_diverges(&self, arms: &'tcx [hir::Arm], source: hir::MatchSource) {
|
||||||
if self.diverges.get().always() {
|
if self.diverges.get().is_always() {
|
||||||
use hir::MatchSource::*;
|
use hir::MatchSource::*;
|
||||||
let msg = match source {
|
let msg = match source {
|
||||||
IfDesugar { .. } | IfLetDesugar { .. } => "block in `if` expression",
|
IfDesugar { .. } | IfLetDesugar { .. } => "block in `if` expression",
|
||||||
|
|
|
@ -170,10 +170,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
|
|
||||||
// Any expression that produces a value of type `!` must have diverged
|
// Any expression that produces a value of type `!` must have diverged
|
||||||
if ty.is_never() {
|
if ty.is_never() {
|
||||||
self.diverges.set(self.diverges.get() | Diverges::Always {
|
self.diverges.set(self.diverges.get() | Diverges::always(expr.span));
|
||||||
span: expr.span,
|
|
||||||
custom_note: None
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Record the type, which applies it effects.
|
// Record the type, which applies it effects.
|
||||||
|
|
|
@ -470,6 +470,16 @@ pub enum Diverges {
|
||||||
WarnedAlways
|
WarnedAlways
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Diverges {
|
||||||
|
/// Creates a `Diverges::Always` with the provided span and the default note message
|
||||||
|
fn always(span: Span) -> Diverges {
|
||||||
|
Diverges::Always {
|
||||||
|
span,
|
||||||
|
custom_note: None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Convenience impls for combinig `Diverges`.
|
// Convenience impls for combinig `Diverges`.
|
||||||
|
|
||||||
impl ops::BitAnd for Diverges {
|
impl ops::BitAnd for Diverges {
|
||||||
|
@ -499,7 +509,7 @@ impl ops::BitOrAssign for Diverges {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Diverges {
|
impl Diverges {
|
||||||
fn always(self) -> bool {
|
fn is_always(self) -> bool {
|
||||||
// Enum comparison ignores the
|
// Enum comparison ignores the
|
||||||
// contents of fields, so we just
|
// contents of fields, so we just
|
||||||
// fill them in with garbage here.
|
// fill them in with garbage here.
|
||||||
|
@ -3852,7 +3862,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
//
|
//
|
||||||
// #41425 -- label the implicit `()` as being the
|
// #41425 -- label the implicit `()` as being the
|
||||||
// "found type" here, rather than the "expected type".
|
// "found type" here, rather than the "expected type".
|
||||||
if !self.diverges.get().always() {
|
if !self.diverges.get().is_always() {
|
||||||
// #50009 -- Do not point at the entire fn block span, point at the return type
|
// #50009 -- Do not point at the entire fn block span, point at the return type
|
||||||
// span, as it is the cause of the requirement, and
|
// span, as it is the cause of the requirement, and
|
||||||
// `consider_hint_about_removing_semicolon` will point at the last expression
|
// `consider_hint_about_removing_semicolon` will point at the last expression
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue