@@ -66,7 +66,6 @@ use rustc_session::parse::{add_feature_diagnostics, feature_err};
6666use rustc_span:: symbol:: { kw, sym, Ident , Symbol } ;
6767use rustc_span:: { DesugaringKind , Span , DUMMY_SP } ;
6868use smallvec:: SmallVec ;
69- use std:: borrow:: Cow ;
7069use std:: collections:: hash_map:: Entry ;
7170use thin_vec:: ThinVec ;
7271
@@ -884,27 +883,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
884883 binder : NodeId ,
885884 generic_params : & [ GenericParam ] ,
886885 ) -> & ' 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 )
908888 . collect ( ) ;
909889 let extra_lifetimes = self . resolver . take_extra_lifetime_params ( binder) ;
910890 debug ! ( ?extra_lifetimes) ;
@@ -2136,7 +2116,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
21362116 param : & GenericParam ,
21372117 source : hir:: GenericParamSource ,
21382118 ) -> hir:: GenericParam < ' hir > {
2139- let ( name, kind) = self . lower_generic_param_kind ( param) ;
2119+ let ( name, kind) = self . lower_generic_param_kind ( param, source ) ;
21402120
21412121 let hir_id = self . lower_node_id ( param. id ) ;
21422122 self . lower_attrs ( hir_id, & param. attrs ) ;
@@ -2155,6 +2135,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
21552135 fn lower_generic_param_kind (
21562136 & mut self ,
21572137 param : & GenericParam ,
2138+ source : hir:: GenericParamSource ,
21582139 ) -> ( hir:: ParamName , hir:: GenericParamKind < ' hir > ) {
21592140 match & param. kind {
21602141 GenericParamKind :: Lifetime => {
@@ -2173,22 +2154,51 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
21732154 ( param_name, kind)
21742155 }
21752156 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| {
21782172 self . lower_ty (
2179- x ,
2173+ def ,
21802174 & ImplTraitContext :: Disallowed ( ImplTraitPosition :: GenericDefault ) ,
21812175 )
2182- } ) ,
2183- synthetic : false ,
2184- } ;
2176+ } ) ;
2177+
2178+ let kind = hir :: GenericParamKind :: Type { default , synthetic : false } ;
21852179
21862180 ( hir:: ParamName :: Plain ( self . lower_ident ( param. ident ) ) , kind)
21872181 }
21882182 GenericParamKind :: Const { ty, kw_span : _, default } => {
21892183 let ty = self
21902184 . 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+
21922202 (
21932203 hir:: ParamName :: Plain ( self . lower_ident ( param. ident ) ) ,
21942204 hir:: GenericParamKind :: Const { ty, default, is_host_effect : false } ,
0 commit comments