Skip to content

Commit 8bfc0c5

Browse files
committed
Add rustc_never_type_mode = "no_fallback"
1 parent 80ebf84 commit 8bfc0c5

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

compiler/rustc_hir_typeck/src/fallback.rs

+16-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ enum DivergingFallbackBehavior {
1414
FallbackToUnit,
1515
/// Sometimes fallback to `!`, but mainly fallback to `()` so that most of the crates are not broken.
1616
FallbackToNiko,
17+
/// Always fallback to `!` (which should be equivalent to never falling back + not making
18+
/// never-to-any coercions unless necessary)
19+
FallbackToNever,
1720
/// Don't fallback at all
1821
NoFallback,
1922
}
@@ -103,9 +106,10 @@ impl<'tcx> FnCtxt<'_, 'tcx> {
103106
match mode {
104107
sym::fallback_to_unit => DivergingFallbackBehavior::FallbackToUnit,
105108
sym::fallback_to_niko => DivergingFallbackBehavior::FallbackToNiko,
109+
sym::fallback_to_never => DivergingFallbackBehavior::FallbackToNever,
106110
sym::no_fallback => DivergingFallbackBehavior::NoFallback,
107111
_ => {
108-
self.tcx.dcx().span_err(span, format!("unknown never type mode: `{mode}` (supported: `fallback_to_unit`, `fallback_to_niko`, and `no_fallback`)"));
112+
self.tcx.dcx().span_err(span, format!("unknown never type mode: `{mode}` (supported: `fallback_to_unit`, `fallback_to_niko`, `fallback_to_never` and `no_fallback`)"));
109113

110114
DivergingFallbackBehavior::FallbackToUnit
111115
}
@@ -422,8 +426,18 @@ impl<'tcx> FnCtxt<'_, 'tcx> {
422426
diverging_fallback.insert(diverging_ty, self.tcx.types.never);
423427
}
424428
}
429+
FallbackToNever => {
430+
debug!(
431+
"fallback to ! - `rustc_never_type_mode = \"fallback_to_never\")`: {:?}",
432+
diverging_vid
433+
);
434+
diverging_fallback.insert(diverging_ty, self.tcx.types.never);
435+
}
425436
NoFallback => {
426-
debug!("no fallback - `rustc_never_type_mode = "no_fallback"`: {:?}", diverging_vid);
437+
debug!(
438+
"no fallback - `rustc_never_type_mode = \"no_fallback\"`: {:?}",
439+
diverging_vid
440+
);
427441
}
428442
}
429443
}

compiler/rustc_span/src/symbol.rs

+1
Original file line numberDiff line numberDiff line change
@@ -815,6 +815,7 @@ symbols! {
815815
fadd_algebraic,
816816
fadd_fast,
817817
fake_variadic,
818+
fallback_to_never,
818819
fallback_to_niko,
819820
fallback_to_unit,
820821
fdiv_algebraic,

0 commit comments

Comments
 (0)