|
33 | 33 | #![allow(internal_features)] |
34 | 34 | #![feature(rustdoc_internals)] |
35 | 35 | #![doc(rust_logo)] |
| 36 | +#![feature(if_let_guard)] |
36 | 37 | #![feature(box_patterns)] |
37 | 38 | #![feature(let_chains)] |
38 | 39 | #![recursion_limit = "256"] |
@@ -65,6 +66,7 @@ use rustc_session::parse::{add_feature_diagnostics, feature_err}; |
65 | 66 | use rustc_span::symbol::{kw, sym, Ident, Symbol}; |
66 | 67 | use rustc_span::{DesugaringKind, Span, DUMMY_SP}; |
67 | 68 | use smallvec::SmallVec; |
| 69 | +use std::borrow::Cow; |
68 | 70 | use std::collections::hash_map::Entry; |
69 | 71 | use thin_vec::ThinVec; |
70 | 72 |
|
@@ -878,8 +880,27 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { |
878 | 880 | binder: NodeId, |
879 | 881 | generic_params: &[GenericParam], |
880 | 882 | ) -> &'hir [hir::GenericParam<'hir>] { |
881 | | - let mut generic_params: Vec<_> = self |
882 | | - .lower_generic_params_mut(generic_params, hir::GenericParamSource::Binder) |
| 883 | + let mut generic_params: Vec<_> = generic_params |
| 884 | + .iter() |
| 885 | + .map(|param| { |
| 886 | + let param = match param.kind { |
| 887 | + GenericParamKind::Type { ref default } if let Some(ty) = default => { |
| 888 | + // Default type is not permitted in non-lifetime binders. |
| 889 | + // So we emit an error and default to `None` to prevent |
| 890 | + // potential ice. |
| 891 | + self.dcx().emit_err(errors::UnexpectedDefaultParameterInBinder { |
| 892 | + span: ty.span(), |
| 893 | + }); |
| 894 | + let param = GenericParam { |
| 895 | + kind: GenericParamKind::Type { default: None }, |
| 896 | + ..param.clone() |
| 897 | + }; |
| 898 | + Cow::Owned(param) |
| 899 | + } |
| 900 | + _ => Cow::Borrowed(param), |
| 901 | + }; |
| 902 | + self.lower_generic_param(param.as_ref(), hir::GenericParamSource::Binder) |
| 903 | + }) |
883 | 904 | .collect(); |
884 | 905 | let extra_lifetimes = self.resolver.take_extra_lifetime_params(binder); |
885 | 906 | debug!(?extra_lifetimes); |
|
0 commit comments