diff options
| author | Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> | 2021-11-15 20:40:29 +0100 |
|---|---|---|
| committer | Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> | 2021-11-15 20:40:29 +0100 |
| commit | d64aea65ad3b994ed0e1503f836d82a9896ab468 (patch) | |
| tree | 3199ceb46387dfbcbd8f8c73bc686dc9f6d9d6b5 /src/test | |
| parent | eab2d7519a3f1c11ddaff3d19f8b7727354c6362 (diff) | |
Fix `non-constant value` ICE (#90878)
This also fixes the same suggestion, which was kind of broken, because it just searched for the last occurence of `const` to replace with a `let`. This works great in some cases, but when there is no const and a leading space to the file, it doesn't work and panic with overflow because it thought that it had found a const. I also changed the suggestion to only trigger if the `const` and the non-constant value are on the same line, because if they aren't, the suggestion is very likely to be wrong. Also don't trigger the suggestion if the found `const` is on line 0, because that triggers the ICE.
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/ui/consts/issue-90878-2.rs | 12 | ||||
| -rw-r--r-- | src/test/ui/consts/issue-90878-2.stderr | 30 | ||||
| -rw-r--r-- | src/test/ui/consts/issue-90878.rs | 4 | ||||
| -rw-r--r-- | src/test/ui/consts/issue-90878.stderr | 11 | ||||
| -rw-r--r-- | src/test/ui/consts/non-const-value-in-const.rs | 7 | ||||
| -rw-r--r-- | src/test/ui/consts/non-const-value-in-const.stderr | 20 |
6 files changed, 84 insertions, 0 deletions
diff --git a/src/test/ui/consts/issue-90878-2.rs b/src/test/ui/consts/issue-90878-2.rs new file mode 100644 index 00000000000..7e3f18cc9d5 --- /dev/null +++ b/src/test/ui/consts/issue-90878-2.rs @@ -0,0 +1,12 @@ + #![l=|x|[b;x ]] //~ ERROR unexpected token: `|x| [b; x]` +//~^ ERROR cannot find attribute `l` in this scope +//~^^ ERROR attempt to use a non-constant value in a constant [E0435] +//~^^^ ERROR cannot find value `b` in this scope [E0425] + +// notice the space at the start, +// we can't attach any attributes to this file because it needs to be at the start + +// this example has been slightly modified (adding ]] at the end), so that it actually works here +// it still produces the same issue though + +fn main() {} diff --git a/src/test/ui/consts/issue-90878-2.stderr b/src/test/ui/consts/issue-90878-2.stderr new file mode 100644 index 00000000000..9e167424995 --- /dev/null +++ b/src/test/ui/consts/issue-90878-2.stderr @@ -0,0 +1,30 @@ +error: unexpected token: `|x| [b; x]` + --> $DIR/issue-90878-2.rs:1:7 + | +LL | #![l=|x|[b;x ]] + | ^^^^^^^^^ + +error: cannot find attribute `l` in this scope + --> $DIR/issue-90878-2.rs:1:5 + | +LL | #![l=|x|[b;x ]] + | ^ + +error[E0435]: attempt to use a non-constant value in a constant + --> $DIR/issue-90878-2.rs:1:13 + | +LL | #![l=|x|[b;x ]] + | - ^ + | | + | this would need to be a `const` + +error[E0425]: cannot find value `b` in this scope + --> $DIR/issue-90878-2.rs:1:11 + | +LL | #![l=|x|[b;x ]] + | ^ help: a local variable with a similar name exists: `x` + +error: aborting due to 4 previous errors + +Some errors have detailed explanations: E0425, E0435. +For more information about an error, try `rustc --explain E0425`. diff --git a/src/test/ui/consts/issue-90878.rs b/src/test/ui/consts/issue-90878.rs new file mode 100644 index 00000000000..43f6fe5f380 --- /dev/null +++ b/src/test/ui/consts/issue-90878.rs @@ -0,0 +1,4 @@ + fn main() { + |x: usize| [0; x]; //~ ERROR attempt to use a non-constant value in a constant [E0435] + // (note the space before "fn") +} diff --git a/src/test/ui/consts/issue-90878.stderr b/src/test/ui/consts/issue-90878.stderr new file mode 100644 index 00000000000..c038fc622d4 --- /dev/null +++ b/src/test/ui/consts/issue-90878.stderr @@ -0,0 +1,11 @@ +error[E0435]: attempt to use a non-constant value in a constant + --> $DIR/issue-90878.rs:2:20 + | +LL | |x: usize| [0; x]; + | - ^ + | | + | this would need to be a `const` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0435`. diff --git a/src/test/ui/consts/non-const-value-in-const.rs b/src/test/ui/consts/non-const-value-in-const.rs new file mode 100644 index 00000000000..1a20b1e09d7 --- /dev/null +++ b/src/test/ui/consts/non-const-value-in-const.rs @@ -0,0 +1,7 @@ +fn main() { + let x = 5; + const Y: i32 = x; //~ ERROR attempt to use a non-constant value in a constant [E0435] + + let x = 5; + let _ = [0; x]; //~ ERROR attempt to use a non-constant value in a constant [E0435] +} diff --git a/src/test/ui/consts/non-const-value-in-const.stderr b/src/test/ui/consts/non-const-value-in-const.stderr new file mode 100644 index 00000000000..0ce4b4b7053 --- /dev/null +++ b/src/test/ui/consts/non-const-value-in-const.stderr @@ -0,0 +1,20 @@ +error[E0435]: attempt to use a non-constant value in a constant + --> $DIR/non-const-value-in-const.rs:3:20 + | +LL | const Y: i32 = x; + | ------- ^ non-constant value + | | + | help: consider using `let` instead of `const`: `let Y` + +error[E0435]: attempt to use a non-constant value in a constant + --> $DIR/non-const-value-in-const.rs:6:17 + | +LL | let x = 5; + | ----- help: consider using `const` instead of `let`: `const x` +... +LL | let _ = [0; x]; + | ^ non-constant value + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0435`. |
