|
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 |
|
@@ -874,8 +876,27 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { |
874 | 876 | binder: NodeId, |
875 | 877 | generic_params: &[GenericParam], |
876 | 878 | ) -> &'hir [hir::GenericParam<'hir>] { |
877 | | - let mut generic_params: Vec<_> = self |
878 | | - .lower_generic_params_mut(generic_params, hir::GenericParamSource::Binder) |
| 879 | + let mut generic_params: Vec<_> = generic_params |
| 880 | + .iter() |
| 881 | + .map(|param| { |
| 882 | + let param = match param.kind { |
| 883 | + GenericParamKind::Type { ref default } if let Some(ty) = default => { |
| 884 | + // Default type is not permitted in non-lifetime binders. |
| 885 | + // So we emit an error and default to `None` to prevent |
| 886 | + // potential ice. |
| 887 | + self.tcx.sess.emit_err(errors::UnexpectedDefaultParameterInBinder { |
| 888 | + span: ty.span(), |
| 889 | + }); |
| 890 | + let param = GenericParam { |
| 891 | + kind: GenericParamKind::Type { default: None }, |
| 892 | + ..param.clone() |
| 893 | + }; |
| 894 | + Cow::Owned(param) |
| 895 | + } |
| 896 | + _ => Cow::Borrowed(param), |
| 897 | + }; |
| 898 | + self.lower_generic_param(param.as_ref(), hir::GenericParamSource::Binder) |
| 899 | + }) |
879 | 900 | .collect(); |
880 | 901 | let extra_lifetimes = self.resolver.take_extra_lifetime_params(binder); |
881 | 902 | debug!(?extra_lifetimes); |
|
0 commit comments