Skip to content

Commit

Permalink
improve snippet for "did you mean x"
Browse files Browse the repository at this point in the history
  • Loading branch information
0xmohit committed Sep 29, 2016
1 parent 4f79716 commit 422d553
Show file tree
Hide file tree
Showing 19 changed files with 77 additions and 37 deletions.
17 changes: 10 additions & 7 deletions src/librustc_typeck/check/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2959,24 +2959,27 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
.emit();
self.tcx().types.err
} else {
let mut err = self.type_error_struct(expr.span, |actual| {
format!("attempted access of field `{}` on type `{}`, \
but no field with that name was found",
let mut err = self.type_error_struct(field.span, |actual| {
format!("no field `{}` on type `{}`",
field.node, actual)
}, expr_t);
match expr_t.sty {
ty::TyAdt(def, _) if !def.is_enum() => {
if let Some(suggested_field_name) =
Self::suggest_field_name(def.struct_variant(), field, vec![]) {
err.span_help(field.span,
&format!("did you mean `{}`?", suggested_field_name));
};
err.span_label(field.span,
&format!("did you mean `{}`?", suggested_field_name));
} else {
err.span_label(field.span, &format!("unknown field"));
}
}
ty::TyRawPtr(..) => {
err.note(&format!("`{0}` is a native pointer; perhaps you need to deref with \
`(*{0}).{1}`", pprust::expr_to_string(base), field.node));
}
_ => {}
_ => {
err.span_label(field.span, &format!("unknown field"));
}
}
err.emit();
self.tcx().types.err
Expand Down
6 changes: 4 additions & 2 deletions src/test/compile-fail/attempted-access-non-fatal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
// Check that bogus field access is non-fatal
fn main() {
let x = 0;
let _ = x.foo; //~ ERROR attempted access of field
let _ = x.bar; //~ ERROR attempted access of field
let _ = x.foo; //~ ERROR no field `foo` on type
//~| NOTE unknown field
let _ = x.bar; //~ ERROR no field `bar` on type
//~| NOTE unknown field
}
3 changes: 2 additions & 1 deletion src/test/compile-fail/cast-rfc0401.rs
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,8 @@ fn main()
//~| NOTE required for the cast to the object type `Foo`

// check no error cascade
let _ = main.f as *const u32; //~ ERROR attempted access of field
let _ = main.f as *const u32; //~ ERROR no field `f` on type `fn() {main}`
//~| NOTE unknown field

let cf: *const Foo = &0;
let _ = cf as *const [u16];
Expand Down
3 changes: 2 additions & 1 deletion src/test/compile-fail/derived-errors/issue-30580.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ impl<'a, 'tcx> Pass<'a, 'tcx>
pub fn tcx(&self) -> &'a &'tcx () { self.1 }
fn lol(&mut self, b: &Foo)
{
b.c; //~ ERROR no field with that name was found
b.c; //~ ERROR no field `c` on type `&Foo`
//~| unknown field
self.tcx();
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/test/compile-fail/issue-11004.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ struct A { x: i32, y: f64 }

#[cfg(not(works))]
unsafe fn access(n:*mut A) -> (i32, f64) {
let x : i32 = n.x; //~ ERROR attempted access of field `x`
let x : i32 = n.x; //~ ERROR no field `x`
//~| NOTE `n` is a native pointer; perhaps you need to deref with `(*n).x`
let y : f64 = n.y; //~ ERROR attempted access of field `y`
let y : f64 = n.y; //~ ERROR no field `y`
//~| NOTE `n` is a native pointer; perhaps you need to deref with `(*n).y`
(x, y)
}
Expand Down
3 changes: 1 addition & 2 deletions src/test/compile-fail/issue-14721.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,5 @@

fn main() {
let foo = "str";
println!("{}", foo.desc); //~ ERROR attempted access of field `desc` on type `&str`,
// but no field with that name was found
println!("{}", foo.desc); //~ ERROR no field `desc` on type `&str`
}
2 changes: 1 addition & 1 deletion src/test/compile-fail/issue-19244-2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@ const STRUCT: MyStruct = MyStruct { field: 42 };

fn main() {
let a: [isize; STRUCT.nonexistent_field];
//~^ ERROR attempted access of field `nonexistent_field`
//~^ ERROR no field `nonexistent_field`
}
3 changes: 2 additions & 1 deletion src/test/compile-fail/issue-23253.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ enum Foo { Bar }

fn main() {
Foo::Bar.a;
//~^ ERROR: attempted access of field `a` on type `Foo`, but no field with that name was found
//~^ ERROR: no field `a` on type `Foo`
//~| NOTE unknown field
}
2 changes: 1 addition & 1 deletion src/test/compile-fail/issue-24363.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
// except according to those terms.

fn main() {
1.create_a_type_error[ //~ ERROR attempted access of field
1.create_a_type_error[ //~ ERROR no field `create_a_type_error`
()+() //~ ERROR binary operation `+` cannot be applied
// ^ ensure that we typeck the inner expression ^
];
Expand Down
10 changes: 7 additions & 3 deletions src/test/compile-fail/issue-24365.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,17 @@ pub enum Foo {
}

fn test(a: Foo) {
println!("{}", a.b); //~ ERROR attempted access of field
println!("{}", a.b); //~ ERROR no field `b` on type `Foo`
//~| NOTE unknown field
//~| NOTE in this expansion
}

fn main() {
let x = Attribute::Code {
attr_name_idx: 42,
};
let z = (&x).attr_name_idx; //~ ERROR attempted access of field
let y = x.attr_name_idx; //~ ERROR attempted access of field
let z = (&x).attr_name_idx; //~ ERROR no field `attr_name_idx` on type `&Attribute`
//~| NOTE unknown field
let y = x.attr_name_idx; //~ ERROR no field `attr_name_idx` on type `Attribute`
//~| NOTE unknown field
}
3 changes: 2 additions & 1 deletion src/test/compile-fail/issue-31011.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
macro_rules! log {
( $ctx:expr, $( $args:expr),* ) => {
if $ctx.trace {
//~^ ERROR attempted access of field `trace` on type `&T`, but no field with that name
//~^ ERROR no field `trace` on type `&T`
//~| NOTE unknown field
println!( $( $args, )* );
}
}
Expand Down
27 changes: 27 additions & 0 deletions src/test/compile-fail/issue-36164.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// Copyright 2015 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

struct Foo {
bar: u8
}

struct Bar {
}

fn main() {
let f = Foo { bar: 22 };
f.xxx;
//~^ ERROR no field `xxx` on type `Foo`
//~| NOTE did you mean `bar`?
let g = Bar { };
g.yyy;
//~^ ERROR no field `yyy` on type `Bar`
//~| NOTE unknown field
}
3 changes: 2 additions & 1 deletion src/test/compile-fail/no-type-for-node-ice.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@
// Related issues: #20401, #20506, #20614, #20752, #20829, #20846, #20885, #20886

fn main() {
"".homura[""]; //~ ERROR no field with that name was found
"".homura[""]; //~ ERROR no field `homura`
//~| NOTE unknown field
}
4 changes: 2 additions & 2 deletions src/test/compile-fail/struct-fields-typo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ fn main() {
foo: 0,
bar: 0.5,
};
let x = foo.baa;//~ ERROR attempted access of field `baa` on type `BuildData`
//~^ HELP did you mean `bar`?
let x = foo.baa;//~ ERROR no field `baa` on type `BuildData`
//~| NOTE did you mean `bar`?
println!("{}", x);
}
2 changes: 1 addition & 1 deletion src/test/compile-fail/struct-pat-derived-error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ struct a {

impl a {
fn foo(&self) {
let a { x, y } = self.d; //~ ERROR attempted access of field `d`
let a { x, y } = self.d; //~ ERROR no field `d`
//~^ ERROR struct `a` does not have a field named `x`
//~^^ ERROR struct `a` does not have a field named `y`
//~^^^ ERROR pattern does not mention field `b`
Expand Down
4 changes: 2 additions & 2 deletions src/test/compile-fail/union/union-suggest-field.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ fn main() {
let u = U { principle: 0 };
//~^ ERROR union `U` has no field named `principle`
//~| NOTE field does not exist - did you mean `principal`?
let w = u.principial; //~ ERROR attempted access of field `principial` on type `U`
//~^ HELP did you mean `principal`?
let w = u.principial; //~ ERROR no field `principial` on type `U`
//~| NOTE did you mean `principal`?

let y = u.calculate; //~ ERROR attempted to take value of method `calculate` on type `U`
//~^ HELP maybe a `()` to call it is missing?
Expand Down
2 changes: 1 addition & 1 deletion src/test/compile-fail/unsafe-fn-autoderef.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ fn f(p: *const Rec) -> isize {
// are prohibited by various checks, such as that the enum is
// instantiable and so forth).

return p.f; //~ ERROR attempted access of field `f` on type `*const Rec`
return p.f; //~ ERROR no field `f` on type `*const Rec`
}

fn main() {
Expand Down
4 changes: 2 additions & 2 deletions src/test/incremental/struct_change_field_name.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,13 @@ pub fn use_X() -> u32 {
let x: X = X { x: 22 };
//[cfail2]~^ ERROR struct `X` has no field named `x`
x.x as u32
//[cfail2]~^ ERROR attempted access of field `x`
//[cfail2]~^ ERROR no field `x` on type `X`
}

#[rustc_dirty(label="TypeckItemBody", cfg="cfail2")]
pub fn use_EmbedX(embed: EmbedX) -> u32 {
embed.x.x as u32
//[cfail2]~^ ERROR attempted access of field `x`
//[cfail2]~^ ERROR no field `x`
}

#[rustc_clean(label="TypeckItemBody", cfg="cfail2")]
Expand Down
12 changes: 6 additions & 6 deletions src/test/ui/macros/macro-backtrace-invalid-internals.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ error: no method named `fake` found for type `{integer}` in the current scope
50 | fake_method_stmt!();
| -------------------- in this macro invocation

error: attempted access of field `fake` on type `{integer}`, but no field with that name was found
--> $DIR/macro-backtrace-invalid-internals.rs:21:11
error: no field `fake` on type `{integer}`
--> $DIR/macro-backtrace-invalid-internals.rs:21:13
|
21 | 1.fake
| ^^^^^^
| ^^^^ unknown field
...
51 | fake_field_stmt!();
| ------------------- in this macro invocation
Expand All @@ -34,11 +34,11 @@ error: no method named `fake` found for type `{integer}` in the current scope
54 | let _ = fake_method_expr!();
| ------------------- in this macro invocation

error: attempted access of field `fake` on type `{integer}`, but no field with that name was found
--> $DIR/macro-backtrace-invalid-internals.rs:39:11
error: no field `fake` on type `{integer}`
--> $DIR/macro-backtrace-invalid-internals.rs:39:13
|
39 | 1.fake
| ^^^^^^
| ^^^^ unknown field
...
55 | let _ = fake_field_expr!();
| ------------------ in this macro invocation
Expand Down

0 comments on commit 422d553

Please sign in to comment.