Skip to content

Commit adfdd27

Browse files
committed
Add rustc_never_type_mode = "no_fallback"
1 parent 19bc337 commit adfdd27

File tree

3 files changed

+18
-3
lines changed

3 files changed

+18
-3
lines changed

Diff for: compiler/rustc_feature/src/builtin_attrs.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
581581
),
582582

583583
rustc_attr!(
584-
rustc_never_type_mode, Normal, template!(NameValueStr: "fallback_to_unit|fallback_to_niko|no_fallback"), ErrorFollowing,
584+
rustc_never_type_mode, Normal, template!(NameValueStr: "fallback_to_unit|fallback_to_niko|fallback_to_never|no_fallback"), ErrorFollowing,
585585
@only_local: true,
586586
"`rustc_never_type_fallback` is used to experiment with never type fallback and work on \
587587
never type stabilization, and will never be stable"

Diff for: 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
}
@@ -107,9 +110,10 @@ impl<'tcx> FnCtxt<'_, 'tcx> {
107110
match mode {
108111
sym::fallback_to_unit => DivergingFallbackBehavior::FallbackToUnit,
109112
sym::fallback_to_niko => DivergingFallbackBehavior::FallbackToNiko,
113+
sym::fallback_to_never => DivergingFallbackBehavior::FallbackToNever,
110114
sym::no_fallback => DivergingFallbackBehavior::NoFallback,
111115
_ => {
112-
self.tcx.dcx().span_err(span, format!("unknown never type mode: `{mode}` (supported: `fallback_to_unit`, `fallback_to_niko`, and `no_fallback`)"));
116+
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`)"));
113117

114118
DivergingFallbackBehavior::FallbackToUnit
115119
}
@@ -426,8 +430,18 @@ impl<'tcx> FnCtxt<'_, 'tcx> {
426430
diverging_fallback.insert(diverging_ty, self.tcx.types.never);
427431
}
428432
}
433+
FallbackToNever => {
434+
debug!(
435+
"fallback to ! - `rustc_never_type_mode = \"fallback_to_never\")`: {:?}",
436+
diverging_vid
437+
);
438+
diverging_fallback.insert(diverging_ty, self.tcx.types.never);
439+
}
429440
NoFallback => {
430-
debug!("no fallback - `rustc_never_type_mode = "no_fallback"`: {:?}", diverging_vid);
441+
debug!(
442+
"no fallback - `rustc_never_type_mode = \"no_fallback\"`: {:?}",
443+
diverging_vid
444+
);
431445
}
432446
}
433447
}

Diff for: 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)