diff options
| author | bohan <bohan-zhang@foxmail.com> | 2023-12-23 15:57:24 +0800 |
|---|---|---|
| committer | bohan <bohan-zhang@foxmail.com> | 2023-12-26 16:10:29 +0800 |
| commit | e16efbd23afe98d1bda104d850e0285591d3a5d8 (patch) | |
| tree | e1443ff56e2edfb7cd6f73cbd812149fef373808 /compiler/rustc_ast_lowering/src | |
| parent | 1ab783112ab4e4807304dbd249b39771246013ef (diff) | |
| download | rust-e16efbd23afe98d1bda104d850e0285591d3a5d8.tar.gz rust-e16efbd23afe98d1bda104d850e0285591d3a5d8.zip | |
fallback `default` to `None` during ast-loweing for lifetime binder
Diffstat (limited to 'compiler/rustc_ast_lowering/src')
| -rw-r--r-- | compiler/rustc_ast_lowering/src/errors.rs | 7 | ||||
| -rw-r--r-- | compiler/rustc_ast_lowering/src/lib.rs | 25 |
2 files changed, 30 insertions, 2 deletions
diff --git a/compiler/rustc_ast_lowering/src/errors.rs b/compiler/rustc_ast_lowering/src/errors.rs index 11bb559719b..718a5b03cf2 100644 --- a/compiler/rustc_ast_lowering/src/errors.rs +++ b/compiler/rustc_ast_lowering/src/errors.rs @@ -395,3 +395,10 @@ pub enum BadReturnTypeNotation { span: Span, }, } + +#[derive(Diagnostic)] +#[diag(ast_lowering_default_parameter_in_binder)] +pub(crate) struct UnexpectedDefaultParameterInBinder { + #[primary_span] + pub span: Span, +} diff --git a/compiler/rustc_ast_lowering/src/lib.rs b/compiler/rustc_ast_lowering/src/lib.rs index e3954116288..243f278a520 100644 --- a/compiler/rustc_ast_lowering/src/lib.rs +++ b/compiler/rustc_ast_lowering/src/lib.rs @@ -33,6 +33,7 @@ #![allow(internal_features)] #![feature(rustdoc_internals)] #![doc(rust_logo)] +#![feature(if_let_guard)] #![feature(box_patterns)] #![feature(let_chains)] #![recursion_limit = "256"] @@ -65,6 +66,7 @@ use rustc_session::parse::{add_feature_diagnostics, feature_err}; use rustc_span::symbol::{kw, sym, Ident, Symbol}; use rustc_span::{DesugaringKind, Span, DUMMY_SP}; use smallvec::SmallVec; +use std::borrow::Cow; use std::collections::hash_map::Entry; use thin_vec::ThinVec; @@ -878,8 +880,27 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { binder: NodeId, generic_params: &[GenericParam], ) -> &'hir [hir::GenericParam<'hir>] { - let mut generic_params: Vec<_> = self - .lower_generic_params_mut(generic_params, hir::GenericParamSource::Binder) + let mut generic_params: Vec<_> = generic_params + .iter() + .map(|param| { + let param = match param.kind { + GenericParamKind::Type { ref default } if let Some(ty) = default => { + // Default type is not permitted in non-lifetime binders. + // So we emit an error and default to `None` to prevent + // potential ice. + self.dcx().emit_err(errors::UnexpectedDefaultParameterInBinder { + span: ty.span(), + }); + let param = GenericParam { + kind: GenericParamKind::Type { default: None }, + ..param.clone() + }; + Cow::Owned(param) + } + _ => Cow::Borrowed(param), + }; + self.lower_generic_param(param.as_ref(), hir::GenericParamSource::Binder) + }) .collect(); let extra_lifetimes = self.resolver.take_extra_lifetime_params(binder); debug!(?extra_lifetimes); |
