indexing: reword help
Co-authored-by: beef <ent3rm4n@gmail.com>
This commit is contained in:
parent
a2db928053
commit
86f2d424c8
6 changed files with 30 additions and 34 deletions
|
|
@ -1,5 +1,5 @@
|
|||
An attempt to use index on a type which doesn't implement the `std::ops::Index`
|
||||
trait was performed.
|
||||
Attempted to index a value whose type doesn't implement the
|
||||
`std::ops::Index` trait.
|
||||
|
||||
Erroneous code example:
|
||||
|
||||
|
|
@ -7,8 +7,8 @@ Erroneous code example:
|
|||
0u8[2]; // error: cannot index into a value of type `u8`
|
||||
```
|
||||
|
||||
To be able to index into a type it needs to implement the `std::ops::Index`
|
||||
trait. Example:
|
||||
Only values with types that implement the `std::ops::Index` trait
|
||||
can be indexed with square brackets. Example:
|
||||
|
||||
```
|
||||
let v: Vec<u8> = vec![0, 1, 2, 3];
|
||||
|
|
@ -16,3 +16,10 @@ let v: Vec<u8> = vec![0, 1, 2, 3];
|
|||
// The `Vec` type implements the `Index` trait so you can do:
|
||||
println!("{}", v[2]);
|
||||
```
|
||||
|
||||
Tuples and structs are indexed with dot (`.`), not with brackets (`[]`),
|
||||
and tuple element names are their positions:
|
||||
```ignore(pseudo code)
|
||||
// this (pseudo code) expression is true for any tuple:
|
||||
tuple == (tuple.0, tuple.1, ...)
|
||||
```
|
||||
|
|
|
|||
|
|
@ -3551,35 +3551,20 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
);
|
||||
// Try to give some advice about indexing tuples.
|
||||
if let ty::Tuple(types) = base_t.kind() {
|
||||
let mut needs_note = true;
|
||||
// If the index is an integer, we can show the actual
|
||||
// fixed expression:
|
||||
err.help(
|
||||
"tuples are indexed with a dot and a literal index: `tuple.0`, `tuple.1`, etc.",
|
||||
);
|
||||
// If index is an unsuffixed integer, show the fixed expression:
|
||||
if let ExprKind::Lit(lit) = idx.kind
|
||||
&& let ast::LitKind::Int(i, ast::LitIntType::Unsuffixed) = lit.node
|
||||
&& i.get()
|
||||
< types
|
||||
.len()
|
||||
.try_into()
|
||||
.expect("expected tuple index to be < usize length")
|
||||
&& i.get() < types.len().try_into().expect("tuple length fits in u128")
|
||||
{
|
||||
err.span_suggestion(
|
||||
brackets_span,
|
||||
"to access tuple elements, use",
|
||||
format!("to access tuple element `{i}`, use"),
|
||||
format!(".{i}"),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
needs_note = false;
|
||||
} else if let ExprKind::Path(..) = idx.peel_borrows().kind {
|
||||
err.span_label(
|
||||
idx.span,
|
||||
"cannot access tuple elements at a variable index",
|
||||
);
|
||||
}
|
||||
if needs_note {
|
||||
err.help(
|
||||
"to access tuple elements, use tuple indexing \
|
||||
syntax (e.g., `tuple.0`)",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,9 @@ error[E0608]: cannot index into a value of type `({integer},)`
|
|||
--> $DIR/index_message.rs:3:14
|
||||
|
|
||||
LL | let _ = z[0];
|
||||
| ^^^ help: to access tuple elements, use: `.0`
|
||||
| ^^^ help: to access tuple element `0`, use: `.0`
|
||||
|
|
||||
= help: tuples are indexed with a dot and a literal index: `tuple.0`, `tuple.1`, etc.
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@ error[E0608]: cannot index into a value of type `({integer}, {integer}, {integer
|
|||
--> $DIR/issue-27842.rs:4:16
|
||||
|
|
||||
LL | let _ = tup[0];
|
||||
| ^^^ help: to access tuple elements, use: `.0`
|
||||
| ^^^ help: to access tuple element `0`, use: `.0`
|
||||
|
|
||||
= help: tuples are indexed with a dot and a literal index: `tuple.0`, `tuple.1`, etc.
|
||||
|
||||
error[E0608]: cannot index into a value of type `({integer}, {integer}, {integer})`
|
||||
--> $DIR/issue-27842.rs:9:16
|
||||
|
|
||||
LL | let _ = tup[i];
|
||||
| ^-^
|
||||
| |
|
||||
| cannot access tuple elements at a variable index
|
||||
| ^^^
|
||||
|
|
||||
= help: to access tuple elements, use tuple indexing syntax (e.g., `tuple.0`)
|
||||
= help: tuples are indexed with a dot and a literal index: `tuple.0`, `tuple.1`, etc.
|
||||
|
||||
error[E0608]: cannot index into a value of type `({integer},)`
|
||||
--> $DIR/issue-27842.rs:14:16
|
||||
|
|
@ -20,7 +20,7 @@ error[E0608]: cannot index into a value of type `({integer},)`
|
|||
LL | let _ = tup[3];
|
||||
| ^^^
|
||||
|
|
||||
= help: to access tuple elements, use tuple indexing syntax (e.g., `tuple.0`)
|
||||
= help: tuples are indexed with a dot and a literal index: `tuple.0`, `tuple.1`, etc.
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,9 @@ error[E0608]: cannot index into a value of type `({integer},)`
|
|||
--> $DIR/suggestion-non-ascii.rs:3:24
|
||||
|
|
||||
LL | println!("☃{}", tup[0]);
|
||||
| ^^^ help: to access tuple elements, use: `.0`
|
||||
| ^^^ help: to access tuple element `0`, use: `.0`
|
||||
|
|
||||
= help: tuples are indexed with a dot and a literal index: `tuple.0`, `tuple.1`, etc.
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ error[E0608]: cannot index into a value of type `()`
|
|||
LL | ()[f(&[1.0])];
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= help: to access tuple elements, use tuple indexing syntax (e.g., `tuple.0`)
|
||||
= help: tuples are indexed with a dot and a literal index: `tuple.0`, `tuple.1`, etc.
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue