diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index c12df083c30e6..b1d3292e04ca8 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -3879,13 +3879,9 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { element_ty } None => { - let mut err = self.type_error_struct( - expr.span, - |actual| { - format!("cannot index a value of type `{}`", - actual) - }, - base_t); + let mut err = type_error_struct!(tcx.sess, expr.span, base_t, E0608, + "cannot index into a value of type `{}`", + base_t); // Try to give some advice about indexing tuples. if let ty::TyTuple(..) = base_t.sty { let mut needs_note = true; diff --git a/src/librustc_typeck/diagnostics.rs b/src/librustc_typeck/diagnostics.rs index f6103a259dcd6..df9356ea81148 100644 --- a/src/librustc_typeck/diagnostics.rs +++ b/src/librustc_typeck/diagnostics.rs @@ -4096,6 +4096,27 @@ assert_eq!(!Question::No, true); ``` "##, +E0608: r##" +An attempt to index into a type which doesn't implement the `std::ops::Index` +trait was performed. + +Erroneous code example: + +```compile_fail,E0608 +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: + +``` +let v: Vec = vec![0, 1, 2, 3]; + +// The `Vec` type implements the `Index` trait so you can do: +println!("{}", v[2]); +``` +"##, + E0609: r##" Attempted to access a non-existent field in a struct. diff --git a/src/test/compile-fail/E0608.rs b/src/test/compile-fail/E0608.rs new file mode 100644 index 0000000000000..d47356a97eeda --- /dev/null +++ b/src/test/compile-fail/E0608.rs @@ -0,0 +1,13 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + 0u8[2]; //~ ERROR E0608 +} diff --git a/src/test/compile-fail/index-bot.rs b/src/test/compile-fail/index-bot.rs index 05b0472330048..fc88ff6f47b87 100644 --- a/src/test/compile-fail/index-bot.rs +++ b/src/test/compile-fail/index-bot.rs @@ -9,5 +9,5 @@ // except according to those terms. fn main() { - (return)[0]; //~ ERROR cannot index a value of type `!` + (return)[0]; //~ ERROR cannot index into a value of type `!` } diff --git a/src/test/compile-fail/index_message.rs b/src/test/compile-fail/index_message.rs index 26dd98757a8c2..b9daad936c338 100644 --- a/src/test/compile-fail/index_message.rs +++ b/src/test/compile-fail/index_message.rs @@ -10,5 +10,5 @@ fn main() { let z = (); - let _ = z[0]; //~ ERROR cannot index a value of type `()` + let _ = z[0]; //~ ERROR cannot index into a value of type `()` } diff --git a/src/test/compile-fail/issue-27842.rs b/src/test/compile-fail/issue-27842.rs index f7cd4e03c3b11..8c71761df2fb8 100644 --- a/src/test/compile-fail/issue-27842.rs +++ b/src/test/compile-fail/issue-27842.rs @@ -12,13 +12,13 @@ fn main() { let tup = (0, 1, 2); // the case where we show a suggestion let _ = tup[0]; - //~^ ERROR cannot index a value of type + //~^ ERROR cannot index into a value of type //~| HELP to access tuple elements, use //~| SUGGESTION let _ = tup.0 // the case where we show just a general hint let i = 0_usize; let _ = tup[i]; - //~^ ERROR cannot index a value of type + //~^ ERROR cannot index into a value of type //~| HELP to access tuple elements, use tuple indexing syntax (e.g. `tuple.0`) } diff --git a/src/test/compile-fail/issue-40861.rs b/src/test/compile-fail/issue-40861.rs index e525b3954f5ed..75d58c58538da 100644 --- a/src/test/compile-fail/issue-40861.rs +++ b/src/test/compile-fail/issue-40861.rs @@ -12,5 +12,5 @@ fn f(_: &[f32]) {} fn main() { ()[f(&[1.0])]; - //~^ ERROR cannot index a value of type `()` + //~^ ERROR cannot index into a value of type `()` } diff --git a/src/test/compile-fail/slice-2.rs b/src/test/compile-fail/slice-2.rs index 99dc3e68c8f79..44b9d94c5665c 100644 --- a/src/test/compile-fail/slice-2.rs +++ b/src/test/compile-fail/slice-2.rs @@ -14,8 +14,8 @@ struct Foo; fn main() { let x = Foo; - &x[..]; //~ ERROR cannot index a value of type `Foo` - &x[Foo..]; //~ ERROR cannot index a value of type `Foo` - &x[..Foo]; //~ ERROR cannot index a value of type `Foo` - &x[Foo..Foo]; //~ ERROR cannot index a value of type `Foo` + &x[..]; //~ ERROR cannot index into a value of type `Foo` + &x[Foo..]; //~ ERROR cannot index into a value of type `Foo` + &x[..Foo]; //~ ERROR cannot index into a value of type `Foo` + &x[Foo..Foo]; //~ ERROR cannot index into a value of type `Foo` } diff --git a/src/test/ui/span/suggestion-non-ascii.stderr b/src/test/ui/span/suggestion-non-ascii.stderr index b6353c0f6a205..68d43d3f5cd85 100644 --- a/src/test/ui/span/suggestion-non-ascii.stderr +++ b/src/test/ui/span/suggestion-non-ascii.stderr @@ -1,4 +1,4 @@ -error: cannot index a value of type `({integer},)` +error[E0608]: cannot index into a value of type `({integer},)` --> $DIR/suggestion-non-ascii.rs:14:21 | 14 | println!("☃{}", tup[0]);