07e7823c01
If a symbol name can only be imported from one place for a type, and as long as it was not glob-imported anywhere in the current crate, we can trim its printed path and print only the name. This has wide implications on error messages with types, for example, shortening `std::vec::Vec` to just `Vec`, as long as there is no other `Vec` importable anywhere. This adds a new '-Z trim-diagnostic-paths=false' option to control this feature. On the good path, with no diagnosis printed, we should try to avoid issuing this query, so we need to prevent trimmed_def_paths query on several cases. This change also relies on a previous commit that differentiates between `Debug` and `Display` on various rustc types, where the latter is trimmed and presented to the user and the former is not.
45 lines
1.3 KiB
Rust
45 lines
1.3 KiB
Rust
// The regression test for #15031 to make sure destructuring trait
|
|
// reference work properly.
|
|
|
|
#![feature(box_patterns)]
|
|
#![feature(box_syntax)]
|
|
|
|
trait T { fn foo(&self) {} }
|
|
impl T for isize {}
|
|
|
|
fn main() {
|
|
// For an expression of the form:
|
|
//
|
|
// let &...&x = &..&SomeTrait;
|
|
//
|
|
// Say we have n `&` at the left hand and m `&` right hand, then:
|
|
// if n < m, we are golden;
|
|
// if n == m, it's a derefing non-derefable type error;
|
|
// if n > m, it's a type mismatch error.
|
|
|
|
// n < m
|
|
let &x = &(&1isize as &dyn T);
|
|
let &x = &&(&1isize as &dyn T);
|
|
let &&x = &&(&1isize as &dyn T);
|
|
|
|
// n == m
|
|
let &x = &1isize as &dyn T; //~ ERROR type `&dyn T` cannot be dereferenced
|
|
let &&x = &(&1isize as &dyn T); //~ ERROR type `&dyn T` cannot be dereferenced
|
|
let box x = box 1isize as Box<dyn T>;
|
|
//~^ ERROR type `Box<dyn T>` cannot be dereferenced
|
|
|
|
// n > m
|
|
let &&x = &1isize as &dyn T;
|
|
//~^ ERROR mismatched types
|
|
//~| expected trait object `dyn T`
|
|
//~| found reference `&_`
|
|
let &&&x = &(&1isize as &dyn T);
|
|
//~^ ERROR mismatched types
|
|
//~| expected trait object `dyn T`
|
|
//~| found reference `&_`
|
|
let box box x = box 1isize as Box<dyn T>;
|
|
//~^ ERROR mismatched types
|
|
//~| expected trait object `dyn T`
|
|
//~| found struct `Box<_>`
|
|
}
|