@@ -66,7 +66,6 @@ use rustc_session::parse::{add_feature_diagnostics, feature_err};
66
66
use rustc_span:: symbol:: { kw, sym, Ident , Symbol } ;
67
67
use rustc_span:: { DesugaringKind , Span , DUMMY_SP } ;
68
68
use smallvec:: SmallVec ;
69
- use std:: borrow:: Cow ;
70
69
use std:: collections:: hash_map:: Entry ;
71
70
use thin_vec:: ThinVec ;
72
71
@@ -884,27 +883,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
884
883
binder : NodeId ,
885
884
generic_params : & [ GenericParam ] ,
886
885
) -> & ' hir [ hir:: GenericParam < ' hir > ] {
887
- let mut generic_params: Vec < _ > = generic_params
888
- . iter ( )
889
- . map ( |param| {
890
- let param = match param. kind {
891
- GenericParamKind :: Type { ref default } if let Some ( ty) = default => {
892
- // Default type is not permitted in non-lifetime binders.
893
- // So we emit an error and default to `None` to prevent
894
- // potential ice.
895
- self . dcx ( ) . emit_err ( errors:: UnexpectedDefaultParameterInBinder {
896
- span : ty. span ( ) ,
897
- } ) ;
898
- let param = GenericParam {
899
- kind : GenericParamKind :: Type { default : None } ,
900
- ..param. clone ( )
901
- } ;
902
- Cow :: Owned ( param)
903
- }
904
- _ => Cow :: Borrowed ( param) ,
905
- } ;
906
- self . lower_generic_param ( param. as_ref ( ) , hir:: GenericParamSource :: Binder )
907
- } )
886
+ let mut generic_params: Vec < _ > = self
887
+ . lower_generic_params_mut ( generic_params, hir:: GenericParamSource :: Binder )
908
888
. collect ( ) ;
909
889
let extra_lifetimes = self . resolver . take_extra_lifetime_params ( binder) ;
910
890
debug ! ( ?extra_lifetimes) ;
@@ -2136,7 +2116,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
2136
2116
param : & GenericParam ,
2137
2117
source : hir:: GenericParamSource ,
2138
2118
) -> hir:: GenericParam < ' hir > {
2139
- let ( name, kind) = self . lower_generic_param_kind ( param) ;
2119
+ let ( name, kind) = self . lower_generic_param_kind ( param, source ) ;
2140
2120
2141
2121
let hir_id = self . lower_node_id ( param. id ) ;
2142
2122
self . lower_attrs ( hir_id, & param. attrs ) ;
@@ -2155,6 +2135,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
2155
2135
fn lower_generic_param_kind (
2156
2136
& mut self ,
2157
2137
param : & GenericParam ,
2138
+ source : hir:: GenericParamSource ,
2158
2139
) -> ( hir:: ParamName , hir:: GenericParamKind < ' hir > ) {
2159
2140
match & param. kind {
2160
2141
GenericParamKind :: Lifetime => {
@@ -2173,22 +2154,51 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
2173
2154
( param_name, kind)
2174
2155
}
2175
2156
GenericParamKind :: Type { default, .. } => {
2176
- let kind = hir:: GenericParamKind :: Type {
2177
- default : default. as_ref ( ) . map ( |x| {
2157
+ // Not only do we deny type param defaults in binders but we also map them to `None`
2158
+ // since later compiler stages cannot handle them (and shouldn't need to be able to).
2159
+ let default = default
2160
+ . as_ref ( )
2161
+ . filter ( |_| match source {
2162
+ hir:: GenericParamSource :: Generics => true ,
2163
+ hir:: GenericParamSource :: Binder => {
2164
+ self . dcx ( ) . emit_err ( errors:: HigherRankedGenParamWithDefault {
2165
+ span : param. span ( ) ,
2166
+ } ) ;
2167
+
2168
+ false
2169
+ }
2170
+ } )
2171
+ . map ( |def| {
2178
2172
self . lower_ty (
2179
- x ,
2173
+ def ,
2180
2174
& ImplTraitContext :: Disallowed ( ImplTraitPosition :: GenericDefault ) ,
2181
2175
)
2182
- } ) ,
2183
- synthetic : false ,
2184
- } ;
2176
+ } ) ;
2177
+
2178
+ let kind = hir :: GenericParamKind :: Type { default , synthetic : false } ;
2185
2179
2186
2180
( hir:: ParamName :: Plain ( self . lower_ident ( param. ident ) ) , kind)
2187
2181
}
2188
2182
GenericParamKind :: Const { ty, kw_span : _, default } => {
2189
2183
let ty = self
2190
2184
. lower_ty ( ty, & ImplTraitContext :: Disallowed ( ImplTraitPosition :: GenericDefault ) ) ;
2191
- let default = default. as_ref ( ) . map ( |def| self . lower_anon_const ( def) ) ;
2185
+
2186
+ // Not only do we deny const param defaults in binders but we also map them to `None`
2187
+ // since later compiler stages cannot handle them (and shouldn't need to be able to).
2188
+ let default = default
2189
+ . as_ref ( )
2190
+ . filter ( |_| match source {
2191
+ hir:: GenericParamSource :: Generics => true ,
2192
+ hir:: GenericParamSource :: Binder => {
2193
+ self . dcx ( ) . emit_err ( errors:: HigherRankedGenParamWithDefault {
2194
+ span : param. span ( ) ,
2195
+ } ) ;
2196
+
2197
+ false
2198
+ }
2199
+ } )
2200
+ . map ( |def| self . lower_anon_const ( def) ) ;
2201
+
2192
2202
(
2193
2203
hir:: ParamName :: Plain ( self . lower_ident ( param. ident ) ) ,
2194
2204
hir:: GenericParamKind :: Const { ty, default, is_host_effect : false } ,
0 commit comments