don't elide shared parts of types in diagnostics when --verbose
is passed
this also changes some parts of lifetime printing, which previously were not gated behind `-Z verbose`
This commit is contained in:
parent
b5d8361909
commit
cb6d033316
8 changed files with 72 additions and 21 deletions
|
@ -1206,6 +1206,23 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
s.push_highlighted(mutbl.prefix_str());
|
s.push_highlighted(mutbl.prefix_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn maybe_highlight<T: Eq + ToString>(
|
||||||
|
t1: T,
|
||||||
|
t2: T,
|
||||||
|
(buf1, buf2): &mut (DiagnosticStyledString, DiagnosticStyledString),
|
||||||
|
tcx: TyCtxt<'_>,
|
||||||
|
) {
|
||||||
|
let highlight = t1 != t2;
|
||||||
|
let (t1, t2) = if highlight || tcx.sess.opts.verbose {
|
||||||
|
(t1.to_string(), t2.to_string())
|
||||||
|
} else {
|
||||||
|
// The two types are the same, elide and don't highlight.
|
||||||
|
("_".into(), "_".into())
|
||||||
|
};
|
||||||
|
buf1.push(t1, highlight);
|
||||||
|
buf2.push(t2, highlight);
|
||||||
|
}
|
||||||
|
|
||||||
fn cmp_ty_refs<'tcx>(
|
fn cmp_ty_refs<'tcx>(
|
||||||
r1: ty::Region<'tcx>,
|
r1: ty::Region<'tcx>,
|
||||||
mut1: hir::Mutability,
|
mut1: hir::Mutability,
|
||||||
|
@ -1302,7 +1319,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
if lifetimes.0 != lifetimes.1 {
|
if lifetimes.0 != lifetimes.1 {
|
||||||
values.0.push_highlighted(l1);
|
values.0.push_highlighted(l1);
|
||||||
values.1.push_highlighted(l2);
|
values.1.push_highlighted(l2);
|
||||||
} else if lifetimes.0.is_bound() {
|
} else if lifetimes.0.is_bound() || self.tcx.sess.opts.verbose {
|
||||||
values.0.push_normal(l1);
|
values.0.push_normal(l1);
|
||||||
values.1.push_normal(l2);
|
values.1.push_normal(l2);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1323,7 +1340,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
let num_display_types = consts_offset - regions_len;
|
let num_display_types = consts_offset - regions_len;
|
||||||
for (i, (ta1, ta2)) in type_arguments.take(num_display_types).enumerate() {
|
for (i, (ta1, ta2)) in type_arguments.take(num_display_types).enumerate() {
|
||||||
let i = i + regions_len;
|
let i = i + regions_len;
|
||||||
if ta1 == ta2 && !self.tcx.sess.verbose_internals() {
|
if ta1 == ta2 && !self.tcx.sess.opts.verbose {
|
||||||
values.0.push_normal("_");
|
values.0.push_normal("_");
|
||||||
values.1.push_normal("_");
|
values.1.push_normal("_");
|
||||||
} else {
|
} else {
|
||||||
|
@ -1337,13 +1354,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
let const_arguments = sub1.consts().zip(sub2.consts());
|
let const_arguments = sub1.consts().zip(sub2.consts());
|
||||||
for (i, (ca1, ca2)) in const_arguments.enumerate() {
|
for (i, (ca1, ca2)) in const_arguments.enumerate() {
|
||||||
let i = i + consts_offset;
|
let i = i + consts_offset;
|
||||||
if ca1 == ca2 && !self.tcx.sess.verbose_internals() {
|
maybe_highlight(ca1, ca2, &mut values, self.tcx);
|
||||||
values.0.push_normal("_");
|
|
||||||
values.1.push_normal("_");
|
|
||||||
} else {
|
|
||||||
values.0.push_highlighted(ca1.to_string());
|
|
||||||
values.1.push_highlighted(ca2.to_string());
|
|
||||||
}
|
|
||||||
self.push_comma(&mut values.0, &mut values.1, len, i);
|
self.push_comma(&mut values.0, &mut values.1, len, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1507,16 +1518,9 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
(ty::FnPtr(sig1), ty::FnPtr(sig2)) => self.cmp_fn_sig(sig1, sig2),
|
(ty::FnPtr(sig1), ty::FnPtr(sig2)) => self.cmp_fn_sig(sig1, sig2),
|
||||||
|
|
||||||
_ => {
|
_ => {
|
||||||
if t1 == t2 && !self.tcx.sess.verbose_internals() {
|
let mut strs = (DiagnosticStyledString::new(), DiagnosticStyledString::new());
|
||||||
// The two types are the same, elide and don't highlight.
|
maybe_highlight(t1, t2, &mut strs, self.tcx);
|
||||||
(DiagnosticStyledString::normal("_"), DiagnosticStyledString::normal("_"))
|
strs
|
||||||
} else {
|
|
||||||
// We couldn't find anything in common, highlight everything.
|
|
||||||
(
|
|
||||||
DiagnosticStyledString::highlighted(t1.to_string()),
|
|
||||||
DiagnosticStyledString::highlighted(t2.to_string()),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1116,6 +1116,7 @@ impl Default for Options {
|
||||||
working_dir: RealFileName::LocalPath(std::env::current_dir().unwrap()),
|
working_dir: RealFileName::LocalPath(std::env::current_dir().unwrap()),
|
||||||
color: ColorConfig::Auto,
|
color: ColorConfig::Auto,
|
||||||
logical_env: FxIndexMap::default(),
|
logical_env: FxIndexMap::default(),
|
||||||
|
verbose: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2916,6 +2917,8 @@ pub fn build_session_options(early_dcx: &mut EarlyDiagCtxt, matches: &getopts::M
|
||||||
RealFileName::LocalPath(path.into_owned())
|
RealFileName::LocalPath(path.into_owned())
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let verbose = matches.opt_present("verbose") || unstable_opts.verbose_internals;
|
||||||
|
|
||||||
Options {
|
Options {
|
||||||
assert_incr_state,
|
assert_incr_state,
|
||||||
crate_types,
|
crate_types,
|
||||||
|
@ -2957,6 +2960,7 @@ pub fn build_session_options(early_dcx: &mut EarlyDiagCtxt, matches: &getopts::M
|
||||||
working_dir,
|
working_dir,
|
||||||
color,
|
color,
|
||||||
logical_env,
|
logical_env,
|
||||||
|
verbose,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -223,6 +223,8 @@ top_level_options!(
|
||||||
/// The (potentially remapped) working directory
|
/// The (potentially remapped) working directory
|
||||||
working_dir: RealFileName [TRACKED],
|
working_dir: RealFileName [TRACKED],
|
||||||
color: ColorConfig [UNTRACKED],
|
color: ColorConfig [UNTRACKED],
|
||||||
|
|
||||||
|
verbose: bool [UNTRACKED],
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
// between R0 and R1 properly.
|
// between R0 and R1 properly.
|
||||||
|
|
||||||
// compile-flags: -Zverbose-internals
|
// compile-flags: -Zverbose-internals
|
||||||
// ^^^^^^^^^ force compiler to dump more region information
|
// ^^^^^^^^^^^^^^^^^^^ force compiler to dump more region information
|
||||||
|
|
||||||
#![allow(warnings)]
|
#![allow(warnings)]
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
// including) the call to `use_x`. The `else` branch is not included.
|
// including) the call to `use_x`. The `else` branch is not included.
|
||||||
|
|
||||||
// compile-flags:-Zverbose-internals
|
// compile-flags:-Zverbose-internals
|
||||||
// ^^^^^^^^^ force compiler to dump more region information
|
// ^^^^^^^^^^^^^^^^^^^ force compiler to dump more region information
|
||||||
|
|
||||||
#![allow(warnings)]
|
#![allow(warnings)]
|
||||||
|
|
||||||
|
|
14
tests/ui/type/verbose.normal.stderr
Normal file
14
tests/ui/type/verbose.normal.stderr
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/verbose.rs:7:28
|
||||||
|
|
|
||||||
|
LL | let _: Foo<u32, i32> = Foo::<i32, i32> { x: 0, y: 0 };
|
||||||
|
| ------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Foo<u32, i32>`, found `Foo<i32, i32>`
|
||||||
|
| |
|
||||||
|
| expected due to this
|
||||||
|
|
|
||||||
|
= note: expected struct `Foo<u32, _>`
|
||||||
|
found struct `Foo<i32, _>`
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
13
tests/ui/type/verbose.rs
Normal file
13
tests/ui/type/verbose.rs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
// revisions:verbose normal
|
||||||
|
// [verbose]compile-flags:--verbose
|
||||||
|
#![crate_type = "lib"]
|
||||||
|
|
||||||
|
struct Foo<T, U> { x: T, y: U }
|
||||||
|
fn bar() {
|
||||||
|
let _: Foo<u32, i32> = Foo::<i32, i32> { x: 0, y: 0 };
|
||||||
|
//~^ ERROR mismatched types
|
||||||
|
//[verbose]~| NOTE expected struct `Foo<u32, i32>`
|
||||||
|
//[normal]~| NOTE expected struct `Foo<u32, _>`
|
||||||
|
//~| NOTE expected `Foo<u32, i32>`
|
||||||
|
//~| NOTE expected due to this
|
||||||
|
}
|
14
tests/ui/type/verbose.verbose.stderr
Normal file
14
tests/ui/type/verbose.verbose.stderr
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/verbose.rs:7:28
|
||||||
|
|
|
||||||
|
LL | let _: Foo<u32, i32> = Foo::<i32, i32> { x: 0, y: 0 };
|
||||||
|
| ------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Foo<u32, i32>`, found `Foo<i32, i32>`
|
||||||
|
| |
|
||||||
|
| expected due to this
|
||||||
|
|
|
||||||
|
= note: expected struct `Foo<u32, i32>`
|
||||||
|
found struct `Foo<i32, i32>`
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
Loading…
Add table
Add a link
Reference in a new issue