mirror of
https://github.com/rust-lang/rust.git
synced 2024-12-02 11:44:28 +00:00
Add lowering errors for const generics
Co-Authored-By: Gabriel Smith <yodaldevoid@users.noreply.github.com>
This commit is contained in:
parent
29f7206366
commit
2fec52bf58
@ -1157,6 +1157,15 @@ impl<'a> LoweringContext<'a> {
|
|||||||
match arg {
|
match arg {
|
||||||
ast::GenericArg::Lifetime(lt) => GenericArg::Lifetime(self.lower_lifetime(<)),
|
ast::GenericArg::Lifetime(lt) => GenericArg::Lifetime(self.lower_lifetime(<)),
|
||||||
ast::GenericArg::Type(ty) => GenericArg::Type(self.lower_ty_direct(&ty, itctx)),
|
ast::GenericArg::Type(ty) => GenericArg::Type(self.lower_ty_direct(&ty, itctx)),
|
||||||
|
ast::GenericArg::Const(ct) => {
|
||||||
|
// FIXME(const_generics): const generics are not yet defined in the HIR.
|
||||||
|
self.sess.struct_span_err(
|
||||||
|
ct.value.span,
|
||||||
|
"const generics in any position are currently unsupported",
|
||||||
|
).emit();
|
||||||
|
self.sess.abort_if_errors();
|
||||||
|
bug!();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2441,7 +2450,7 @@ impl<'a> LoweringContext<'a> {
|
|||||||
|this| this.lower_param_bounds(¶m.bounds, itctx.reborrow()),
|
|this| this.lower_param_bounds(¶m.bounds, itctx.reborrow()),
|
||||||
);
|
);
|
||||||
|
|
||||||
match param.kind {
|
let (name, kind) = match param.kind {
|
||||||
GenericParamKind::Lifetime => {
|
GenericParamKind::Lifetime => {
|
||||||
let was_collecting_in_band = self.is_collecting_in_band_lifetimes;
|
let was_collecting_in_band = self.is_collecting_in_band_lifetimes;
|
||||||
self.is_collecting_in_band_lifetimes = false;
|
self.is_collecting_in_band_lifetimes = false;
|
||||||
@ -2457,22 +2466,14 @@ impl<'a> LoweringContext<'a> {
|
|||||||
| hir::LifetimeName::Static => hir::ParamName::Plain(lt.name.ident()),
|
| hir::LifetimeName::Static => hir::ParamName::Plain(lt.name.ident()),
|
||||||
hir::LifetimeName::Error => ParamName::Error,
|
hir::LifetimeName::Error => ParamName::Error,
|
||||||
};
|
};
|
||||||
let param = hir::GenericParam {
|
|
||||||
id: lt.id,
|
let kind = hir::GenericParamKind::Lifetime {
|
||||||
hir_id: lt.hir_id,
|
kind: hir::LifetimeParamKind::Explicit
|
||||||
name: param_name,
|
|
||||||
span: lt.span,
|
|
||||||
pure_wrt_drop: attr::contains_name(¶m.attrs, "may_dangle"),
|
|
||||||
attrs: self.lower_attrs(¶m.attrs),
|
|
||||||
bounds,
|
|
||||||
kind: hir::GenericParamKind::Lifetime {
|
|
||||||
kind: hir::LifetimeParamKind::Explicit,
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
self.is_collecting_in_band_lifetimes = was_collecting_in_band;
|
self.is_collecting_in_band_lifetimes = was_collecting_in_band;
|
||||||
|
|
||||||
param
|
(param_name, kind)
|
||||||
}
|
}
|
||||||
GenericParamKind::Type { ref default, .. } => {
|
GenericParamKind::Type { ref default, .. } => {
|
||||||
// Don't expose `Self` (recovered "keyword used as ident" parse error).
|
// Don't expose `Self` (recovered "keyword used as ident" parse error).
|
||||||
@ -2491,27 +2492,41 @@ impl<'a> LoweringContext<'a> {
|
|||||||
.chain(params)
|
.chain(params)
|
||||||
.collect();
|
.collect();
|
||||||
}
|
}
|
||||||
let LoweredNodeId { node_id, hir_id } = self.lower_node_id(param.id);
|
|
||||||
|
|
||||||
hir::GenericParam {
|
let kind = hir::GenericParamKind::Type {
|
||||||
id: node_id,
|
default: default.as_ref().map(|x| {
|
||||||
hir_id,
|
self.lower_ty(x, ImplTraitContext::disallowed())
|
||||||
name: hir::ParamName::Plain(ident),
|
}),
|
||||||
pure_wrt_drop: attr::contains_name(¶m.attrs, "may_dangle"),
|
synthetic: param.attrs.iter()
|
||||||
attrs: self.lower_attrs(¶m.attrs),
|
.filter(|attr| attr.check_name("rustc_synthetic"))
|
||||||
bounds,
|
.map(|_| hir::SyntheticTyParamKind::ImplTrait)
|
||||||
span: ident.span,
|
.next(),
|
||||||
kind: hir::GenericParamKind::Type {
|
};
|
||||||
default: default.as_ref().map(|x| {
|
|
||||||
self.lower_ty(x, ImplTraitContext::disallowed())
|
(hir::ParamName::Plain(ident), kind)
|
||||||
}),
|
|
||||||
synthetic: param.attrs.iter()
|
|
||||||
.filter(|attr| attr.check_name("rustc_synthetic"))
|
|
||||||
.map(|_| hir::SyntheticTyParamKind::ImplTrait)
|
|
||||||
.next(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
GenericParamKind::Const { .. } => {
|
||||||
|
// FIXME(const_generics): const generics are not yet defined in the HIR.
|
||||||
|
self.sess.struct_span_err(
|
||||||
|
param.ident.span,
|
||||||
|
"const generics in any position are currently unsupported",
|
||||||
|
).emit();
|
||||||
|
self.sess.abort_if_errors();
|
||||||
|
bug!();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let LoweredNodeId { node_id, hir_id } = self.lower_node_id(param.id);
|
||||||
|
|
||||||
|
hir::GenericParam {
|
||||||
|
id: node_id,
|
||||||
|
hir_id,
|
||||||
|
name,
|
||||||
|
span: param.ident.span,
|
||||||
|
pure_wrt_drop: attr::contains_name(¶m.attrs, "may_dangle"),
|
||||||
|
attrs: self.lower_attrs(¶m.attrs),
|
||||||
|
bounds,
|
||||||
|
kind,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -480,6 +480,7 @@ pub fn noop_visit_generic_arg<T: MutVisitor>(arg: &mut GenericArg, vis: &mut T)
|
|||||||
match arg {
|
match arg {
|
||||||
GenericArg::Lifetime(lt) => vis.visit_lifetime(lt),
|
GenericArg::Lifetime(lt) => vis.visit_lifetime(lt),
|
||||||
GenericArg::Type(ty) => vis.visit_ty(ty),
|
GenericArg::Type(ty) => vis.visit_ty(ty),
|
||||||
|
GenericArg::Const(ct) => vis.visit_anon_const(ct),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -698,6 +699,9 @@ pub fn noop_visit_generic_param<T: MutVisitor>(param: &mut GenericParam, vis: &m
|
|||||||
GenericParamKind::Type { default } => {
|
GenericParamKind::Type { default } => {
|
||||||
visit_opt(default, |default| vis.visit_ty(default));
|
visit_opt(default, |default| vis.visit_ty(default));
|
||||||
}
|
}
|
||||||
|
GenericParamKind::Const { ty } => {
|
||||||
|
vis.visit_ty(ty);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,6 +126,7 @@ pub trait Visitor<'ast>: Sized {
|
|||||||
match generic_arg {
|
match generic_arg {
|
||||||
GenericArg::Lifetime(lt) => self.visit_lifetime(lt),
|
GenericArg::Lifetime(lt) => self.visit_lifetime(lt),
|
||||||
GenericArg::Type(ty) => self.visit_ty(ty),
|
GenericArg::Type(ty) => self.visit_ty(ty),
|
||||||
|
GenericArg::Const(ct) => self.visit_anon_const(ct),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn visit_assoc_type_binding(&mut self, type_binding: &'ast TypeBinding) {
|
fn visit_assoc_type_binding(&mut self, type_binding: &'ast TypeBinding) {
|
||||||
@ -486,6 +487,7 @@ pub fn walk_generic_param<'a, V: Visitor<'a>>(visitor: &mut V, param: &'a Generi
|
|||||||
match param.kind {
|
match param.kind {
|
||||||
GenericParamKind::Lifetime => {}
|
GenericParamKind::Lifetime => {}
|
||||||
GenericParamKind::Type { ref default } => walk_list!(visitor, visit_ty, default),
|
GenericParamKind::Type { ref default } => walk_list!(visitor, visit_ty, default),
|
||||||
|
GenericParamKind::Const { ref ty, .. } => visitor.visit_ty(ty),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user