|
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