Skip to content

Commit daf3c45

Browse files
committed
Do not suggest generic const items unless enabled
1 parent 9b36252 commit daf3c45

4 files changed

+106
-1
lines changed

compiler/rustc_resolve/src/late.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -2450,7 +2450,11 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
24502450
ItemKind::Const(box ast::ConstItem { ref generics, ref ty, ref expr, .. }) => {
24512451
self.with_generic_param_rib(
24522452
&generics.params,
2453-
RibKind::Item(HasGenericParams::Yes(generics.span)),
2453+
RibKind::Item(if self.r.tcx.features().generic_const_items {
2454+
HasGenericParams::Yes(generics.span)
2455+
} else {
2456+
HasGenericParams::No
2457+
}),
24542458
LifetimeRibKind::Generics {
24552459
binder: item.id,
24562460
kind: LifetimeBinderKind::ConstItem,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
error[E0401]: can't use generic parameters from outer item
2+
--> $DIR/generic-params-from-outer-item-in-const-item.rs:12:20
3+
|
4+
LL | fn outer<T: Tr>() { // outer function
5+
| - type parameter from outer item
6+
LL | const K: u32 = T::C;
7+
| ^^^^ use of generic parameter from outer item
8+
9+
error[E0401]: can't use generic parameters from outer item
10+
--> $DIR/generic-params-from-outer-item-in-const-item.rs:19:24
11+
|
12+
LL | impl<T> Tr for T { // outer impl block
13+
| - type parameter from outer item
14+
LL | const C: u32 = {
15+
LL | const I: u32 = T::C;
16+
| ^^^^ use of generic parameter from outer item
17+
18+
error[E0401]: can't use generic parameters from outer item
19+
--> $DIR/generic-params-from-outer-item-in-const-item.rs:27:20
20+
|
21+
LL | struct S<T: Tr>(U32<{ // outer struct
22+
| - type parameter from outer item
23+
LL | const _: u32 = T::C;
24+
| ^^^^ use of generic parameter from outer item
25+
26+
error: aborting due to 3 previous errors
27+
28+
For more information about this error, try `rustc --explain E0401`.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
error[E0401]: can't use generic parameters from outer item
2+
--> $DIR/generic-params-from-outer-item-in-const-item.rs:12:20
3+
|
4+
LL | fn outer<T: Tr>() { // outer function
5+
| - type parameter from outer item
6+
LL | const K: u32 = T::C;
7+
| - ^^^^ use of generic parameter from outer item
8+
| |
9+
| help: try introducing a local generic parameter here: `<T>`
10+
11+
error[E0401]: can't use generic parameters from outer item
12+
--> $DIR/generic-params-from-outer-item-in-const-item.rs:19:24
13+
|
14+
LL | impl<T> Tr for T { // outer impl block
15+
| - type parameter from outer item
16+
LL | const C: u32 = {
17+
LL | const I: u32 = T::C;
18+
| - ^^^^ use of generic parameter from outer item
19+
| |
20+
| help: try introducing a local generic parameter here: `<T>`
21+
22+
error[E0401]: can't use generic parameters from outer item
23+
--> $DIR/generic-params-from-outer-item-in-const-item.rs:27:20
24+
|
25+
LL | struct S<T: Tr>(U32<{ // outer struct
26+
| - type parameter from outer item
27+
LL | const _: u32 = T::C;
28+
| - ^^^^ use of generic parameter from outer item
29+
| |
30+
| help: try introducing a local generic parameter here: `<T>`
31+
32+
error: aborting due to 3 previous errors
33+
34+
For more information about this error, try `rustc --explain E0401`.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Regression test for issue #115720.
2+
// If a const item contains generic params from an outer items, only suggest
3+
// turning the const item generic if the feature `generic_const_items` is enabled.
4+
5+
// revisions: default generic_const_items
6+
7+
#![cfg_attr(generic_const_items, feature(generic_const_items))]
8+
#![feature(generic_const_exprs)] // only used for the test case "outer struct"
9+
#![allow(incomplete_features)]
10+
11+
fn outer<T: Tr>() { // outer function
12+
const K: u32 = T::C;
13+
//~^ ERROR can't use generic parameters from outer item
14+
//[generic_const_items]~| HELP try introducing a local generic parameter here
15+
}
16+
17+
impl<T> Tr for T { // outer impl block
18+
const C: u32 = {
19+
const I: u32 = T::C;
20+
//~^ ERROR can't use generic parameters from outer item
21+
//[generic_const_items]~| HELP try introducing a local generic parameter here
22+
I
23+
};
24+
}
25+
26+
struct S<T: Tr>(U32<{ // outer struct
27+
const _: u32 = T::C;
28+
//~^ ERROR can't use generic parameters from outer item
29+
//[generic_const_items]~| HELP try introducing a local generic parameter here
30+
0
31+
}>);
32+
33+
trait Tr {
34+
const C: u32;
35+
}
36+
37+
struct U32<const N: u32>;
38+
39+
fn main() {}

0 commit comments

Comments
 (0)