Skip to content

Commit 2fec52b

Browse files
varkoryodaldevoid
andcommitted
Add lowering errors for const generics
Co-Authored-By: Gabriel Smith <[email protected]>
1 parent 29f7206 commit 2fec52b

File tree

3 files changed

+53
-32
lines changed

3 files changed

+53
-32
lines changed

src/librustc/hir/lowering.rs

Lines changed: 47 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,6 +1157,15 @@ impl<'a> LoweringContext<'a> {
11571157
match arg {
11581158
ast::GenericArg::Lifetime(lt) => GenericArg::Lifetime(self.lower_lifetime(&lt)),
11591159
ast::GenericArg::Type(ty) => GenericArg::Type(self.lower_ty_direct(&ty, itctx)),
1160+
ast::GenericArg::Const(ct) => {
1161+
// FIXME(const_generics): const generics are not yet defined in the HIR.
1162+
self.sess.struct_span_err(
1163+
ct.value.span,
1164+
"const generics in any position are currently unsupported",
1165+
).emit();
1166+
self.sess.abort_if_errors();
1167+
bug!();
1168+
}
11601169
}
11611170
}
11621171

@@ -2441,7 +2450,7 @@ impl<'a> LoweringContext<'a> {
24412450
|this| this.lower_param_bounds(&param.bounds, itctx.reborrow()),
24422451
);
24432452

2444-
match param.kind {
2453+
let (name, kind) = match param.kind {
24452454
GenericParamKind::Lifetime => {
24462455
let was_collecting_in_band = self.is_collecting_in_band_lifetimes;
24472456
self.is_collecting_in_band_lifetimes = false;
@@ -2457,22 +2466,14 @@ impl<'a> LoweringContext<'a> {
24572466
| hir::LifetimeName::Static => hir::ParamName::Plain(lt.name.ident()),
24582467
hir::LifetimeName::Error => ParamName::Error,
24592468
};
2460-
let param = hir::GenericParam {
2461-
id: lt.id,
2462-
hir_id: lt.hir_id,
2463-
name: param_name,
2464-
span: lt.span,
2465-
pure_wrt_drop: attr::contains_name(&param.attrs, "may_dangle"),
2466-
attrs: self.lower_attrs(&param.attrs),
2467-
bounds,
2468-
kind: hir::GenericParamKind::Lifetime {
2469-
kind: hir::LifetimeParamKind::Explicit,
2470-
}
2469+
2470+
let kind = hir::GenericParamKind::Lifetime {
2471+
kind: hir::LifetimeParamKind::Explicit
24712472
};
24722473

24732474
self.is_collecting_in_band_lifetimes = was_collecting_in_band;
24742475

2475-
param
2476+
(param_name, kind)
24762477
}
24772478
GenericParamKind::Type { ref default, .. } => {
24782479
// Don't expose `Self` (recovered "keyword used as ident" parse error).
@@ -2491,27 +2492,41 @@ impl<'a> LoweringContext<'a> {
24912492
.chain(params)
24922493
.collect();
24932494
}
2494-
let LoweredNodeId { node_id, hir_id } = self.lower_node_id(param.id);
24952495

2496-
hir::GenericParam {
2497-
id: node_id,
2498-
hir_id,
2499-
name: hir::ParamName::Plain(ident),
2500-
pure_wrt_drop: attr::contains_name(&param.attrs, "may_dangle"),
2501-
attrs: self.lower_attrs(&param.attrs),
2502-
bounds,
2503-
span: ident.span,
2504-
kind: hir::GenericParamKind::Type {
2505-
default: default.as_ref().map(|x| {
2506-
self.lower_ty(x, ImplTraitContext::disallowed())
2507-
}),
2508-
synthetic: param.attrs.iter()
2509-
.filter(|attr| attr.check_name("rustc_synthetic"))
2510-
.map(|_| hir::SyntheticTyParamKind::ImplTrait)
2511-
.next(),
2512-
}
2513-
}
2496+
let kind = hir::GenericParamKind::Type {
2497+
default: default.as_ref().map(|x| {
2498+
self.lower_ty(x, ImplTraitContext::disallowed())
2499+
}),
2500+
synthetic: param.attrs.iter()
2501+
.filter(|attr| attr.check_name("rustc_synthetic"))
2502+
.map(|_| hir::SyntheticTyParamKind::ImplTrait)
2503+
.next(),
2504+
};
2505+
2506+
(hir::ParamName::Plain(ident), kind)
25142507
}
2508+
GenericParamKind::Const { .. } => {
2509+
// FIXME(const_generics): const generics are not yet defined in the HIR.
2510+
self.sess.struct_span_err(
2511+
param.ident.span,
2512+
"const generics in any position are currently unsupported",
2513+
).emit();
2514+
self.sess.abort_if_errors();
2515+
bug!();
2516+
}
2517+
};
2518+
2519+
let LoweredNodeId { node_id, hir_id } = self.lower_node_id(param.id);
2520+
2521+
hir::GenericParam {
2522+
id: node_id,
2523+
hir_id,
2524+
name,
2525+
span: param.ident.span,
2526+
pure_wrt_drop: attr::contains_name(&param.attrs, "may_dangle"),
2527+
attrs: self.lower_attrs(&param.attrs),
2528+
bounds,
2529+
kind,
25152530
}
25162531
}
25172532

src/libsyntax/mut_visit.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,7 @@ pub fn noop_visit_generic_arg<T: MutVisitor>(arg: &mut GenericArg, vis: &mut T)
480480
match arg {
481481
GenericArg::Lifetime(lt) => vis.visit_lifetime(lt),
482482
GenericArg::Type(ty) => vis.visit_ty(ty),
483+
GenericArg::Const(ct) => vis.visit_anon_const(ct),
483484
}
484485
}
485486

@@ -698,6 +699,9 @@ pub fn noop_visit_generic_param<T: MutVisitor>(param: &mut GenericParam, vis: &m
698699
GenericParamKind::Type { default } => {
699700
visit_opt(default, |default| vis.visit_ty(default));
700701
}
702+
GenericParamKind::Const { ty } => {
703+
vis.visit_ty(ty);
704+
}
701705
}
702706
}
703707

src/libsyntax/visit.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ pub trait Visitor<'ast>: Sized {
126126
match generic_arg {
127127
GenericArg::Lifetime(lt) => self.visit_lifetime(lt),
128128
GenericArg::Type(ty) => self.visit_ty(ty),
129+
GenericArg::Const(ct) => self.visit_anon_const(ct),
129130
}
130131
}
131132
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
486487
match param.kind {
487488
GenericParamKind::Lifetime => {}
488489
GenericParamKind::Type { ref default } => walk_list!(visitor, visit_ty, default),
490+
GenericParamKind::Const { ref ty, .. } => visitor.visit_ty(ty),
489491
}
490492
}
491493

0 commit comments

Comments
 (0)