indexing: reword help

Co-authored-by: beef <ent3rm4n@gmail.com>
This commit is contained in:
Marijn Schouten 2025-09-15 11:35:08 +00:00
parent a2db928053
commit 86f2d424c8
6 changed files with 30 additions and 34 deletions

View file

@ -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, ...)
```

View file

@ -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`)",
);
}
}

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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