Skip to content

Commit 44ece2e

Browse files
committed
Point at inner item when using outer const param
``` error[E0401]: can't use generic parameters from outer item --> $DIR/const-param-from-outer-fn.rs:3:9 | LL | fn foo<const X: u32>() { | - const parameter from outer item LL | fn bar() -> u32 { | --- generic parameter used in this inner function LL | X | ^ use of generic parameter from outer item | help: try introducing a local generic parameter here | LL | fn bar<X>() -> u32 { | +++ ```
1 parent 8fdd347 commit 44ece2e

File tree

3 files changed

+28
-8
lines changed

3 files changed

+28
-8
lines changed

compiler/rustc_resolve/src/ident.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1484,13 +1484,25 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14841484

14851485
// This was an attempt to use a const parameter outside its scope.
14861486
if let Some(span) = finalize {
1487+
let item = if let Some(diag_metadata) = diag_metadata
1488+
&& let Some(current_item) = diag_metadata.current_item
1489+
{
1490+
let span = current_item
1491+
.kind
1492+
.ident()
1493+
.map(|i| i.span)
1494+
.unwrap_or(current_item.span);
1495+
Some((span, current_item.kind.descr().to_string()))
1496+
} else {
1497+
None
1498+
};
14871499
self.report_error(
14881500
span,
14891501
ResolutionError::GenericParamsFromOuterItem(
14901502
res,
14911503
has_generic_params,
14921504
def_kind,
1493-
None,
1505+
item,
14941506
),
14951507
);
14961508
}

tests/ui/const-generics/early/const-param-from-outer-fn.stderr

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ error[E0401]: can't use generic parameters from outer item
44
LL | fn foo<const X: u32>() {
55
| - const parameter from outer item
66
LL | fn bar() -> u32 {
7+
| --- generic parameter used in this inner function
78
LL | X
89
| ^ use of generic parameter from outer item
910
|

tests/ui/resolve/issue-65035-static-with-parent-generics.stderr

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,14 @@ LL | static a: *const T = Default::default();
2727
error[E0401]: can't use generic parameters from outer item
2828
--> $DIR/issue-65035-static-with-parent-generics.rs:15:24
2929
|
30-
LL | fn h<const N: usize>() {
31-
| - const parameter from outer item
32-
LL | extern "C" {
33-
LL | static a: [u8; N];
34-
| ^ use of generic parameter from outer item
30+
LL | fn h<const N: usize>() {
31+
| - const parameter from outer item
32+
LL | / extern "C" {
33+
LL | | static a: [u8; N];
34+
| | ^ use of generic parameter from outer item
35+
LL | |
36+
LL | | }
37+
| |_____- generic parameter used in this inner extern block
3538
|
3639
= note: a `static` is a separate item from the item that contains it
3740

@@ -41,7 +44,9 @@ error[E0401]: can't use generic parameters from outer item
4144
LL | fn i<const N: usize>() {
4245
| - const parameter from outer item
4346
LL | static a: [u8; N] = [0; N];
44-
| ^ use of generic parameter from outer item
47+
| - ^ use of generic parameter from outer item
48+
| |
49+
| generic parameter used in this inner static item
4550
|
4651
= note: a `static` is a separate item from the item that contains it
4752

@@ -51,7 +56,9 @@ error[E0401]: can't use generic parameters from outer item
5156
LL | fn i<const N: usize>() {
5257
| - const parameter from outer item
5358
LL | static a: [u8; N] = [0; N];
54-
| ^ use of generic parameter from outer item
59+
| - ^ use of generic parameter from outer item
60+
| |
61+
| generic parameter used in this inner static item
5562
|
5663
= note: a `static` is a separate item from the item that contains it
5764

0 commit comments

Comments
 (0)