1
Fork 0

add a test case for generic_const_exprs in trait items

This commit is contained in:
Takayuki Maeda 2022-12-08 14:11:29 +09:00
parent cb596e3015
commit 85d7d9b6b7
4 changed files with 11 additions and 4 deletions

View file

@ -79,7 +79,7 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
let generics = tcx.generics_of(parent_def_id.to_def_id()); let generics = tcx.generics_of(parent_def_id.to_def_id());
let param_def_idx = generics.param_def_id_to_index[&param_id.to_def_id()]; let param_def_idx = generics.param_def_id_to_index[&param_id.to_def_id()];
// In the above example this would be .params[..N#0] // In the above example this would be .params[..N#0]
let params = generics.param_to(param_def_idx as usize, tcx).to_owned(); let params = generics.params_to(param_def_idx as usize, tcx).to_owned();
let param_def_id_to_index = let param_def_id_to_index =
params.iter().map(|param| (param.def_id, param.index)).collect(); params.iter().map(|param| (param.def_id, param.index)).collect();

View file

@ -220,12 +220,12 @@ impl<'tcx> Generics {
} }
} }
pub fn param_to(&'tcx self, param_index: usize, tcx: TyCtxt<'tcx>) -> &'tcx [GenericParamDef] { pub fn params_to(&'tcx self, param_index: usize, tcx: TyCtxt<'tcx>) -> &'tcx [GenericParamDef] {
if let Some(index) = param_index.checked_sub(self.parent_count) { if let Some(index) = param_index.checked_sub(self.parent_count) {
&self.params[..index] &self.params[..index]
} else { } else {
tcx.generics_of(self.parent.expect("parent_count > 0 but no parent?")) tcx.generics_of(self.parent.expect("parent_count > 0 but no parent?"))
.param_to(param_index, tcx) .params_to(param_index, tcx)
} }
} }

View file

@ -3,6 +3,7 @@
trait Trait<T> { trait Trait<T> {
fn fnc<const N: usize = "">(&self) {} //~ERROR defaults for const parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions fn fnc<const N: usize = "">(&self) {} //~ERROR defaults for const parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions
fn foo<const N: usize = { std::mem::size_of::<T>() }>(&self) {} //~ERROR defaults for const parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions
} }
fn main() {} fn main() {}

View file

@ -4,5 +4,11 @@ error: defaults for const parameters are only allowed in `struct`, `enum`, `type
LL | fn fnc<const N: usize = "">(&self) {} LL | fn fnc<const N: usize = "">(&self) {}
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
error: aborting due to previous error error: defaults for const parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions
--> $DIR/issue-105257.rs:6:12
|
LL | fn foo<const N: usize = { std::mem::size_of::<T>() }>(&self) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 2 previous errors