@@ -123,7 +123,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
123
123
body_id : LocalDefId ,
124
124
) -> FnCtxt < ' a , ' tcx > {
125
125
let ( diverging_fallback_behavior, diverging_block_behavior) =
126
- parse_never_type_options_attr ( root_ctxt. tcx ) ;
126
+ never_type_behavior ( root_ctxt. tcx ) ;
127
127
FnCtxt {
128
128
body_id,
129
129
param_env,
@@ -385,9 +385,30 @@ impl<'tcx> LoweredTy<'tcx> {
385
385
}
386
386
}
387
387
388
+ fn never_type_behavior ( tcx : TyCtxt < ' _ > ) -> ( DivergingFallbackBehavior , DivergingBlockBehavior ) {
389
+ let ( fallback, block) = parse_never_type_options_attr ( tcx) ;
390
+ let fallback = fallback. unwrap_or_else ( || default_fallback ( tcx) ) ;
391
+ let block = block. unwrap_or_default ( ) ;
392
+
393
+ ( fallback, block)
394
+ }
395
+
396
+ /// Returns the default fallback which is used when there is no explicit override via `#![never_type_options(...)]`.
397
+ fn default_fallback ( tcx : TyCtxt < ' _ > ) -> DivergingFallbackBehavior {
398
+ use DivergingFallbackBehavior :: * ;
399
+
400
+ // `feature(never_type_fallback)`: fallback to `!` or `()` trying to not break stuff
401
+ if tcx. features ( ) . never_type_fallback {
402
+ return FallbackToNiko ;
403
+ }
404
+
405
+ // Otherwise: fallback to `()`
406
+ FallbackToUnit
407
+ }
408
+
388
409
fn parse_never_type_options_attr (
389
410
tcx : TyCtxt < ' _ > ,
390
- ) -> ( DivergingFallbackBehavior , DivergingBlockBehavior ) {
411
+ ) -> ( Option < DivergingFallbackBehavior > , Option < DivergingBlockBehavior > ) {
391
412
use DivergingFallbackBehavior :: * ;
392
413
393
414
// Error handling is dubious here (unwraps), but that's probably fine for an internal attribute.
@@ -437,11 +458,5 @@ fn parse_never_type_options_attr(
437
458
) ;
438
459
}
439
460
440
- let fallback = fallback. unwrap_or_else ( || {
441
- if tcx. features ( ) . never_type_fallback { FallbackToNiko } else { FallbackToUnit }
442
- } ) ;
443
-
444
- let block = block. unwrap_or_default ( ) ;
445
-
446
461
( fallback, block)
447
462
}
0 commit comments