From cb596e3015811f6d08f45b2ebf41924a8f329c13 Mon Sep 17 00:00:00 2001 From: Takayuki Maeda Date: Wed, 7 Dec 2022 12:55:30 +0900 Subject: [PATCH 1/2] consider `parent_count` for const param defaults --- compiler/rustc_hir_analysis/src/collect/generics_of.rs | 2 +- compiler/rustc_middle/src/ty/generics.rs | 9 +++++++++ .../const-generics/generic_const_exprs/issue-105257.rs | 8 ++++++++ .../generic_const_exprs/issue-105257.stderr | 8 ++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/const-generics/generic_const_exprs/issue-105257.rs create mode 100644 src/test/ui/const-generics/generic_const_exprs/issue-105257.stderr diff --git a/compiler/rustc_hir_analysis/src/collect/generics_of.rs b/compiler/rustc_hir_analysis/src/collect/generics_of.rs index 639f81f20bfb9..225b2ce0c501b 100644 --- a/compiler/rustc_hir_analysis/src/collect/generics_of.rs +++ b/compiler/rustc_hir_analysis/src/collect/generics_of.rs @@ -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 param_def_idx = generics.param_def_id_to_index[¶m_id.to_def_id()]; // In the above example this would be .params[..N#0] - let params = generics.params[..param_def_idx as usize].to_owned(); + let params = generics.param_to(param_def_idx as usize, tcx).to_owned(); let param_def_id_to_index = params.iter().map(|param| (param.def_id, param.index)).collect(); diff --git a/compiler/rustc_middle/src/ty/generics.rs b/compiler/rustc_middle/src/ty/generics.rs index a8da93e4c69b0..e433896eccd52 100644 --- a/compiler/rustc_middle/src/ty/generics.rs +++ b/compiler/rustc_middle/src/ty/generics.rs @@ -220,6 +220,15 @@ impl<'tcx> Generics { } } + pub fn param_to(&'tcx self, param_index: usize, tcx: TyCtxt<'tcx>) -> &'tcx [GenericParamDef] { + if let Some(index) = param_index.checked_sub(self.parent_count) { + &self.params[..index] + } else { + tcx.generics_of(self.parent.expect("parent_count > 0 but no parent?")) + .param_to(param_index, tcx) + } + } + /// Returns the `GenericParamDef` associated with this `EarlyBoundRegion`. pub fn region_param( &'tcx self, diff --git a/src/test/ui/const-generics/generic_const_exprs/issue-105257.rs b/src/test/ui/const-generics/generic_const_exprs/issue-105257.rs new file mode 100644 index 0000000000000..f84918ef705cc --- /dev/null +++ b/src/test/ui/const-generics/generic_const_exprs/issue-105257.rs @@ -0,0 +1,8 @@ +#![feature(generic_const_exprs)] +#![allow(incomplete_features)] + +trait Trait { + fn fnc(&self) {} //~ERROR defaults for const parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions +} + +fn main() {} diff --git a/src/test/ui/const-generics/generic_const_exprs/issue-105257.stderr b/src/test/ui/const-generics/generic_const_exprs/issue-105257.stderr new file mode 100644 index 0000000000000..6b221388b0d7c --- /dev/null +++ b/src/test/ui/const-generics/generic_const_exprs/issue-105257.stderr @@ -0,0 +1,8 @@ +error: defaults for const parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions + --> $DIR/issue-105257.rs:5:12 + | +LL | fn fnc(&self) {} + | ^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + From 85d7d9b6b748d896831502fd2776e9fb356d6d09 Mon Sep 17 00:00:00 2001 From: Takayuki Maeda Date: Thu, 8 Dec 2022 14:11:29 +0900 Subject: [PATCH 2/2] add a test case for `generic_const_exprs` in trait items --- compiler/rustc_hir_analysis/src/collect/generics_of.rs | 2 +- compiler/rustc_middle/src/ty/generics.rs | 4 ++-- .../ui/const-generics/generic_const_exprs/issue-105257.rs | 1 + .../generic_const_exprs/issue-105257.stderr | 8 +++++++- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/compiler/rustc_hir_analysis/src/collect/generics_of.rs b/compiler/rustc_hir_analysis/src/collect/generics_of.rs index 225b2ce0c501b..60bb43245e25d 100644 --- a/compiler/rustc_hir_analysis/src/collect/generics_of.rs +++ b/compiler/rustc_hir_analysis/src/collect/generics_of.rs @@ -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 param_def_idx = generics.param_def_id_to_index[¶m_id.to_def_id()]; // 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 = params.iter().map(|param| (param.def_id, param.index)).collect(); diff --git a/compiler/rustc_middle/src/ty/generics.rs b/compiler/rustc_middle/src/ty/generics.rs index e433896eccd52..72e58158d3f78 100644 --- a/compiler/rustc_middle/src/ty/generics.rs +++ b/compiler/rustc_middle/src/ty/generics.rs @@ -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) { &self.params[..index] } else { tcx.generics_of(self.parent.expect("parent_count > 0 but no parent?")) - .param_to(param_index, tcx) + .params_to(param_index, tcx) } } diff --git a/src/test/ui/const-generics/generic_const_exprs/issue-105257.rs b/src/test/ui/const-generics/generic_const_exprs/issue-105257.rs index f84918ef705cc..d8b23bc01a96d 100644 --- a/src/test/ui/const-generics/generic_const_exprs/issue-105257.rs +++ b/src/test/ui/const-generics/generic_const_exprs/issue-105257.rs @@ -3,6 +3,7 @@ trait Trait { fn fnc(&self) {} //~ERROR defaults for const parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions + fn foo() }>(&self) {} //~ERROR defaults for const parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions } fn main() {} diff --git a/src/test/ui/const-generics/generic_const_exprs/issue-105257.stderr b/src/test/ui/const-generics/generic_const_exprs/issue-105257.stderr index 6b221388b0d7c..ed7a8cb19a4a5 100644 --- a/src/test/ui/const-generics/generic_const_exprs/issue-105257.stderr +++ b/src/test/ui/const-generics/generic_const_exprs/issue-105257.stderr @@ -4,5 +4,11 @@ error: defaults for const parameters are only allowed in `struct`, `enum`, `type LL | fn fnc(&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() }>(&self) {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors