Repository: rust
Issue: UX improvements around const usage and error lints
Labels: A-lints,A-diagnostics,T-compiler,C-bug,A-const-eval

This code produces errors and warnings that I consider suboptimal: 
```rust
#[warn(const_err)]
const TEST: bool = [true][1];
const TEST_2: bool = TEST;

fn main() {}
```
(Playground link: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=20e9f735947348f61b83d9331c36f538 )

The errors and warnings are:
```
   Compiling playground v0.0.1 (/playground)
warning: constant item is never used: `TEST`
 --> src/main.rs:2:1
  |
2 | const TEST: bool = [true][1];
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: constant item is never used: `TEST_2`
 --> src/main.rs:3:1
  |
3 | const TEST_2: bool = TEST;
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^

warning: any use of this value will cause an error
 --> src/main.rs:2:20
  |
2 | const TEST: bool = [true][1];
  | -------------------^^^^^^^^^-
  |                    |
  |                    index out of bounds: the len is 1 but the index is 1
  |
note: the lint level is defined here
 --> src/main.rs:1:8
  |
1 | #[warn(const_err)]
  |        ^^^^^^^^^

error: any use of this value will cause an error
 --> src/main.rs:3:22
  |
3 | const TEST_2: bool = TEST;
  | ---------------------^^^^-
  |                      |
  |                      referenced constant has errors
  |
  = note: `#[deny(const_err)]` on by default

error: aborting due to previous error

error: could not compile `playground`.

To learn more, run the command again with --verbose.
```

What could be better about this error message?
* By setting the `const_err` lint to `warn`, it shows error message "warning: any use of this value will cause an error". Indeed, it errors when `TEST` is used in the definition of `TEST_2`. However, it *also* warns that `TEST` isn't used; so it has a conflicting definition of what counts as "use".
  * Extra verbosity not being great, we could get rid of the "not used" warning here and resolve the conflict of definitions in one go.
* The error message "any use of this value will cause an error" gets repeated. I think the word choice "any" fits well to the warning at definition site, but on the usage site better would be: "error: use of ill-defined/erroneous/something? constant" Maybe also the secondary span could be shortened not to include the item definition; as for me, it muddles the distinction of definition and usage even more. (Might be just here, though, as the usage and definition site are quite similar in this example?)
* The message "note: `#[deny(const_err)]` on by default" is confusing: yes, the default setting for `const_err` is `deny`, but it isn't actually `deny` here. Is the default setting what you wanted to tell about? How is it relevant, especially as it would be better conveyed in the earlier "note: the lint level is defined here" warning?
  * Edit: I understood a bit more about the "note: `#[deny(const_err)]` on by default" message. `#[deny(const_err)]` is a per-item attribute, so it notes that it's on by default... *on this item*. The message could be better.
### Meta
Reproduces on Rust version: 1.43.1 && latest nightly 2020-05-26.