Do not suggest generic const items unless enabled
This commit is contained in:
parent
9b36252477
commit
daf3c45531
4 changed files with 106 additions and 1 deletions
|
@ -2450,7 +2450,11 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
|
||||||
ItemKind::Const(box ast::ConstItem { ref generics, ref ty, ref expr, .. }) => {
|
ItemKind::Const(box ast::ConstItem { ref generics, ref ty, ref expr, .. }) => {
|
||||||
self.with_generic_param_rib(
|
self.with_generic_param_rib(
|
||||||
&generics.params,
|
&generics.params,
|
||||||
RibKind::Item(HasGenericParams::Yes(generics.span)),
|
RibKind::Item(if self.r.tcx.features().generic_const_items {
|
||||||
|
HasGenericParams::Yes(generics.span)
|
||||||
|
} else {
|
||||||
|
HasGenericParams::No
|
||||||
|
}),
|
||||||
LifetimeRibKind::Generics {
|
LifetimeRibKind::Generics {
|
||||||
binder: item.id,
|
binder: item.id,
|
||||||
kind: LifetimeBinderKind::ConstItem,
|
kind: LifetimeBinderKind::ConstItem,
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
error[E0401]: can't use generic parameters from outer item
|
||||||
|
--> $DIR/generic-params-from-outer-item-in-const-item.rs:12:20
|
||||||
|
|
|
||||||
|
LL | fn outer<T: Tr>() { // outer function
|
||||||
|
| - type parameter from outer item
|
||||||
|
LL | const K: u32 = T::C;
|
||||||
|
| ^^^^ use of generic parameter from outer item
|
||||||
|
|
||||||
|
error[E0401]: can't use generic parameters from outer item
|
||||||
|
--> $DIR/generic-params-from-outer-item-in-const-item.rs:19:24
|
||||||
|
|
|
||||||
|
LL | impl<T> Tr for T { // outer impl block
|
||||||
|
| - type parameter from outer item
|
||||||
|
LL | const C: u32 = {
|
||||||
|
LL | const I: u32 = T::C;
|
||||||
|
| ^^^^ use of generic parameter from outer item
|
||||||
|
|
||||||
|
error[E0401]: can't use generic parameters from outer item
|
||||||
|
--> $DIR/generic-params-from-outer-item-in-const-item.rs:27:20
|
||||||
|
|
|
||||||
|
LL | struct S<T: Tr>(U32<{ // outer struct
|
||||||
|
| - type parameter from outer item
|
||||||
|
LL | const _: u32 = T::C;
|
||||||
|
| ^^^^ use of generic parameter from outer item
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0401`.
|
|
@ -0,0 +1,34 @@
|
||||||
|
error[E0401]: can't use generic parameters from outer item
|
||||||
|
--> $DIR/generic-params-from-outer-item-in-const-item.rs:12:20
|
||||||
|
|
|
||||||
|
LL | fn outer<T: Tr>() { // outer function
|
||||||
|
| - type parameter from outer item
|
||||||
|
LL | const K: u32 = T::C;
|
||||||
|
| - ^^^^ use of generic parameter from outer item
|
||||||
|
| |
|
||||||
|
| help: try introducing a local generic parameter here: `<T>`
|
||||||
|
|
||||||
|
error[E0401]: can't use generic parameters from outer item
|
||||||
|
--> $DIR/generic-params-from-outer-item-in-const-item.rs:19:24
|
||||||
|
|
|
||||||
|
LL | impl<T> Tr for T { // outer impl block
|
||||||
|
| - type parameter from outer item
|
||||||
|
LL | const C: u32 = {
|
||||||
|
LL | const I: u32 = T::C;
|
||||||
|
| - ^^^^ use of generic parameter from outer item
|
||||||
|
| |
|
||||||
|
| help: try introducing a local generic parameter here: `<T>`
|
||||||
|
|
||||||
|
error[E0401]: can't use generic parameters from outer item
|
||||||
|
--> $DIR/generic-params-from-outer-item-in-const-item.rs:27:20
|
||||||
|
|
|
||||||
|
LL | struct S<T: Tr>(U32<{ // outer struct
|
||||||
|
| - type parameter from outer item
|
||||||
|
LL | const _: u32 = T::C;
|
||||||
|
| - ^^^^ use of generic parameter from outer item
|
||||||
|
| |
|
||||||
|
| help: try introducing a local generic parameter here: `<T>`
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0401`.
|
|
@ -0,0 +1,39 @@
|
||||||
|
// Regression test for issue #115720.
|
||||||
|
// If a const item contains generic params from an outer items, only suggest
|
||||||
|
// turning the const item generic if the feature `generic_const_items` is enabled.
|
||||||
|
|
||||||
|
// revisions: default generic_const_items
|
||||||
|
|
||||||
|
#![cfg_attr(generic_const_items, feature(generic_const_items))]
|
||||||
|
#![feature(generic_const_exprs)] // only used for the test case "outer struct"
|
||||||
|
#![allow(incomplete_features)]
|
||||||
|
|
||||||
|
fn outer<T: Tr>() { // outer function
|
||||||
|
const K: u32 = T::C;
|
||||||
|
//~^ ERROR can't use generic parameters from outer item
|
||||||
|
//[generic_const_items]~| HELP try introducing a local generic parameter here
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Tr for T { // outer impl block
|
||||||
|
const C: u32 = {
|
||||||
|
const I: u32 = T::C;
|
||||||
|
//~^ ERROR can't use generic parameters from outer item
|
||||||
|
//[generic_const_items]~| HELP try introducing a local generic parameter here
|
||||||
|
I
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
struct S<T: Tr>(U32<{ // outer struct
|
||||||
|
const _: u32 = T::C;
|
||||||
|
//~^ ERROR can't use generic parameters from outer item
|
||||||
|
//[generic_const_items]~| HELP try introducing a local generic parameter here
|
||||||
|
0
|
||||||
|
}>);
|
||||||
|
|
||||||
|
trait Tr {
|
||||||
|
const C: u32;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct U32<const N: u32>;
|
||||||
|
|
||||||
|
fn main() {}
|
Loading…
Add table
Add a link
Reference in a new issue