Skip to content

Use correct span for structured suggestion #80801

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 10, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 18 additions & 8 deletions compiler/rustc_resolve/src/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -398,20 +398,30 @@ impl<'a> Resolver<'a> {
err.help("use the `|| { ... }` closure form instead");
err
}
ResolutionError::AttemptToUseNonConstantValueInConstant(ident, sugg) => {
ResolutionError::AttemptToUseNonConstantValueInConstant(ident, sugg, current) => {
let mut err = struct_span_err!(
self.session,
span,
E0435,
"attempt to use a non-constant value in a constant"
);
err.span_suggestion(
ident.span,
&sugg,
"".to_string(),
Applicability::MaybeIncorrect,
);
err.span_label(span, "non-constant value");
// let foo =...
// ^^^ given this Span
// ------- get this Span to have an applicable suggestion
let sp =
self.session.source_map().span_extend_to_prev_str(ident.span, current, true);
if sp.lo().0 == 0 {
err.span_label(ident.span, &format!("this would need to be a `{}`", sugg));
} else {
let sp = sp.with_lo(BytePos(sp.lo().0 - current.len() as u32));
err.span_suggestion(
sp,
&format!("consider using `{}` instead of `{}`", sugg, current),
format!("{} {}", sugg, ident),
Applicability::MaybeIncorrect,
);
err.span_label(span, "non-constant value");
}
err
}
ResolutionError::BindingShadowsSomethingUnacceptable(what_binding, name, binding) => {
Expand Down
21 changes: 13 additions & 8 deletions compiler/rustc_resolve/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,11 @@ enum ResolutionError<'a> {
/// Error E0434: can't capture dynamic environment in a fn item.
CannotCaptureDynamicEnvironmentInFnItem,
/// Error E0435: attempt to use a non-constant value in a constant.
AttemptToUseNonConstantValueInConstant(Ident, String),
AttemptToUseNonConstantValueInConstant(
Ident,
/* suggestion */ &'static str,
/* current */ &'static str,
),
/// Error E0530: `X` bindings cannot shadow `Y`s.
BindingShadowsSomethingUnacceptable(&'static str, Symbol, &'a NameBinding<'a>),
/// Error E0128: type parameters with a default cannot use forward-declared identifiers.
Expand Down Expand Up @@ -2614,18 +2618,19 @@ impl<'a> Resolver<'a> {
ConstantItemKind::Const => "const",
ConstantItemKind::Static => "static",
};
let sugg = format!(
"consider using `let` instead of `{}`",
kind_str
);
(span, AttemptToUseNonConstantValueInConstant(ident, sugg))
(
span,
AttemptToUseNonConstantValueInConstant(
ident, "let", kind_str,
),
)
} else {
let sugg = "consider using `const` instead of `let`";
(
rib_ident.span,
AttemptToUseNonConstantValueInConstant(
original_rib_ident_def,
sugg.to_string(),
"const",
"let",
),
)
};
Expand Down
4 changes: 3 additions & 1 deletion compiler/rustc_span/src/source_map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -671,7 +671,9 @@ impl SourceMap {
let pat = pat.to_owned() + ws;
if let Ok(prev_source) = self.span_to_prev_source(sp) {
let prev_source = prev_source.rsplit(&pat).next().unwrap_or("").trim_start();
if !prev_source.is_empty() && (!prev_source.contains('\n') || accept_newlines) {
if prev_source.is_empty() && sp.lo().0 != 0 {
return sp.with_lo(BytePos(sp.lo().0 - 1));
} else if !prev_source.contains('\n') || accept_newlines {
return sp.with_lo(BytePos(sp.lo().0 - prev_source.len() as u32));
}
}
Expand Down
6 changes: 6 additions & 0 deletions src/test/ui/error-codes/E0435.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// run-rustfix
fn main () {
#[allow(non_upper_case_globals)]
const foo: usize = 42;
let _: [u8; foo]; //~ ERROR E0435
}
4 changes: 3 additions & 1 deletion src/test/ui/error-codes/E0435.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
// run-rustfix
fn main () {
let foo = 42u32;
#[allow(non_upper_case_globals)]
let foo: usize = 42;
let _: [u8; foo]; //~ ERROR E0435
}
6 changes: 3 additions & 3 deletions src/test/ui/error-codes/E0435.stderr
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
error[E0435]: attempt to use a non-constant value in a constant
--> $DIR/E0435.rs:3:17
--> $DIR/E0435.rs:5:17
|
LL | let foo = 42u32;
| --- help: consider using `const` instead of `let`
LL | let foo: usize = 42;
| ------- help: consider using `const` instead of `let`: `const foo`
LL | let _: [u8; foo];
| ^^^ non-constant value

Expand Down
24 changes: 12 additions & 12 deletions src/test/ui/impl-trait/bindings.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,33 @@ error[E0435]: attempt to use a non-constant value in a constant
--> $DIR/bindings.rs:5:29
|
LL | const foo: impl Clone = x;
| --- ^ non-constant value
| |
| help: consider using `let` instead of `const`
| --------- ^ non-constant value
| |
| help: consider using `let` instead of `const`: `let foo`

error[E0435]: attempt to use a non-constant value in a constant
--> $DIR/bindings.rs:11:33
|
LL | const foo: impl Clone = x;
| --- ^ non-constant value
| |
| help: consider using `let` instead of `const`
| --------- ^ non-constant value
| |
| help: consider using `let` instead of `const`: `let foo`

error[E0435]: attempt to use a non-constant value in a constant
--> $DIR/bindings.rs:18:33
|
LL | const foo: impl Clone = x;
| --- ^ non-constant value
| |
| help: consider using `let` instead of `const`
| --------- ^ non-constant value
| |
| help: consider using `let` instead of `const`: `let foo`

error[E0435]: attempt to use a non-constant value in a constant
--> $DIR/bindings.rs:25:33
|
LL | const foo: impl Clone = x;
| --- ^ non-constant value
| |
| help: consider using `let` instead of `const`
| --------- ^ non-constant value
| |
| help: consider using `let` instead of `const`: `let foo`

warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes
--> $DIR/bindings.rs:1:12
Expand Down
7 changes: 7 additions & 0 deletions src/test/ui/issues/issue-27433.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// run-rustfix
fn main() {
let foo = 42u32;
#[allow(unused_variables, non_snake_case)]
let FOO : u32 = foo;
//~^ ERROR attempt to use a non-constant value in a constant
}
2 changes: 2 additions & 0 deletions src/test/ui/issues/issue-27433.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// run-rustfix
fn main() {
let foo = 42u32;
#[allow(unused_variables, non_snake_case)]
const FOO : u32 = foo;
//~^ ERROR attempt to use a non-constant value in a constant
}
8 changes: 4 additions & 4 deletions src/test/ui/issues/issue-27433.stderr
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
error[E0435]: attempt to use a non-constant value in a constant
--> $DIR/issue-27433.rs:3:23
--> $DIR/issue-27433.rs:5:23
|
LL | const FOO : u32 = foo;
| --- ^^^ non-constant value
| |
| help: consider using `let` instead of `const`
| --------- ^^^ non-constant value
| |
| help: consider using `let` instead of `const`: `let FOO`

error: aborting due to previous error

Expand Down
9 changes: 9 additions & 0 deletions src/test/ui/issues/issue-3521-2.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// run-rustfix
fn main() {
let foo = 100;

let y: isize = foo + 1;
//~^ ERROR attempt to use a non-constant value in a constant

println!("{}", y);
}
1 change: 1 addition & 0 deletions src/test/ui/issues/issue-3521-2.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// run-rustfix
fn main() {
let foo = 100;

Expand Down
8 changes: 4 additions & 4 deletions src/test/ui/issues/issue-3521-2.stderr
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
error[E0435]: attempt to use a non-constant value in a constant
--> $DIR/issue-3521-2.rs:4:23
--> $DIR/issue-3521-2.rs:5:23
|
LL | static y: isize = foo + 1;
| - ^^^ non-constant value
| |
| help: consider using `let` instead of `static`
| -------- ^^^ non-constant value
| |
| help: consider using `let` instead of `static`: `let y`

error: aborting due to previous error

Expand Down
13 changes: 13 additions & 0 deletions src/test/ui/issues/issue-3521.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// run-rustfix
fn main() {
#[allow(non_upper_case_globals)]
const foo: isize = 100;

#[derive(Debug)]
enum Stuff {
Bar = foo
//~^ ERROR attempt to use a non-constant value in a constant
}

println!("{:?}", Stuff::Bar);
}
4 changes: 3 additions & 1 deletion src/test/ui/issues/issue-3521.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// run-rustfix
fn main() {
let foo = 100;
#[allow(non_upper_case_globals)]
let foo: isize = 100;

#[derive(Debug)]
enum Stuff {
Expand Down
6 changes: 3 additions & 3 deletions src/test/ui/issues/issue-3521.stderr
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
error[E0435]: attempt to use a non-constant value in a constant
--> $DIR/issue-3521.rs:6:15
--> $DIR/issue-3521.rs:8:15
|
LL | let foo = 100;
| --- help: consider using `const` instead of `let`
LL | let foo: isize = 100;
| ------- help: consider using `const` instead of `let`: `const foo`
...
LL | Bar = foo
| ^^^ non-constant value
Expand Down
8 changes: 8 additions & 0 deletions src/test/ui/issues/issue-3668-2.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// run-rustfix
#![allow(unused_variables, dead_code)]
fn f(x:isize) {
let child: isize = x + 1;
//~^ ERROR attempt to use a non-constant value in a constant
}

fn main() {}
2 changes: 2 additions & 0 deletions src/test/ui/issues/issue-3668-2.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// run-rustfix
#![allow(unused_variables, dead_code)]
fn f(x:isize) {
static child: isize = x + 1;
//~^ ERROR attempt to use a non-constant value in a constant
Expand Down
8 changes: 4 additions & 4 deletions src/test/ui/issues/issue-3668-2.stderr
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
error[E0435]: attempt to use a non-constant value in a constant
--> $DIR/issue-3668-2.rs:2:27
--> $DIR/issue-3668-2.rs:4:27
|
LL | static child: isize = x + 1;
| ----- ^ non-constant value
| |
| help: consider using `let` instead of `static`
| ------------ ^ non-constant value
| |
| help: consider using `let` instead of `static`: `let child`

error: aborting due to previous error

Expand Down
6 changes: 3 additions & 3 deletions src/test/ui/issues/issue-3668.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ error[E0435]: attempt to use a non-constant value in a constant
--> $DIR/issue-3668.rs:8:34
|
LL | static childVal: Box<P> = self.child.get();
| -------- ^^^^ non-constant value
| |
| help: consider using `let` instead of `static`
| --------------- ^^^^ non-constant value
| |
| help: consider using `let` instead of `static`: `let childVal`

error: aborting due to previous error

Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/issues/issue-42060.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ error[E0435]: attempt to use a non-constant value in a constant
--> $DIR/issue-42060.rs:3:23
|
LL | let thing = ();
| ----- help: consider using `const` instead of `let`
| --------- help: consider using `const` instead of `let`: `const thing`
LL | let other: typeof(thing) = thing;
| ^^^^^ non-constant value

error[E0435]: attempt to use a non-constant value in a constant
--> $DIR/issue-42060.rs:9:13
|
LL | let q = 1;
| - help: consider using `const` instead of `let`
| ----- help: consider using `const` instead of `let`: `const q`
LL | <typeof(q)>::N
| ^ non-constant value

Expand Down
11 changes: 11 additions & 0 deletions src/test/ui/issues/issue-44239.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// run-rustfix
#![allow(dead_code, non_upper_case_globals)]
fn main() {
const n: usize = 0;

struct Foo;
impl Foo {
const N: usize = n;
//~^ ERROR attempt to use a non-constant value
}
}
4 changes: 3 additions & 1 deletion src/test/ui/issues/issue-44239.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// run-rustfix
#![allow(dead_code, non_upper_case_globals)]
fn main() {
let n = 0;
let n: usize = 0;

struct Foo;
impl Foo {
Expand Down
6 changes: 3 additions & 3 deletions src/test/ui/issues/issue-44239.stderr
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
error[E0435]: attempt to use a non-constant value in a constant
--> $DIR/issue-44239.rs:6:26
--> $DIR/issue-44239.rs:8:26
|
LL | let n = 0;
| - help: consider using `const` instead of `let`
LL | let n: usize = 0;
| ----- help: consider using `const` instead of `let`: `const n`
...
LL | const N: usize = n;
| ^ non-constant value
Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/non-constant-expr-for-arr-len.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ error[E0435]: attempt to use a non-constant value in a constant
--> $DIR/non-constant-expr-for-arr-len.rs:5:22
|
LL | fn bar(n: usize) {
| - help: consider using `const` instead of `let`
| - this would need to be a `const`
LL | let _x = [0; n];
| ^ non-constant value
| ^

error: aborting due to previous error

Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/repeat_count.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ error[E0435]: attempt to use a non-constant value in a constant
--> $DIR/repeat_count.rs:5:17
|
LL | let n = 1;
| - help: consider using `const` instead of `let`
| ----- help: consider using `const` instead of `let`: `const n`
LL | let a = [0; n];
| ^ non-constant value

Expand Down
6 changes: 3 additions & 3 deletions src/test/ui/type/type-dependent-def-issue-49241.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ error[E0435]: attempt to use a non-constant value in a constant
--> $DIR/type-dependent-def-issue-49241.rs:3:22
|
LL | const l: usize = v.count();
| - ^ non-constant value
| |
| help: consider using `let` instead of `const`
| ------- ^ non-constant value
| |
| help: consider using `let` instead of `const`: `let l`

error: aborting due to previous error

Expand Down