diff options
| author | Jonathan Turner <jonathandturner@users.noreply.github.com> | 2016-08-17 06:25:26 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-08-17 06:25:26 -0700 |
| commit | f0f12d9fb1753e8a5d0b9ce97770f10631d3439f (patch) | |
| tree | 1da1bcbf29d0663f89bab93e6be55e54767b6127 | |
| parent | eb91d33a14ca1db3ee92eea1066aed62cd2bac57 (diff) | |
| parent | 349f10a15daee7b952889f6a88ea09be76711702 (diff) | |
| download | rust-f0f12d9fb1753e8a5d0b9ce97770f10631d3439f.tar.gz rust-f0f12d9fb1753e8a5d0b9ce97770f10631d3439f.zip | |
Rollup merge of #35686 - mikhail-m1:master, r=jonathandturner
update E0375 to new format fixes #35635 as part of #35233. r? @jonathandturner
| -rw-r--r-- | src/librustc_typeck/coherence/mod.rs | 26 | ||||
| -rw-r--r-- | src/test/compile-fail/E0375.rs | 8 |
2 files changed, 26 insertions, 8 deletions
diff --git a/src/librustc_typeck/coherence/mod.rs b/src/librustc_typeck/coherence/mod.rs index 4a1e401f982..d00cbf0221e 100644 --- a/src/librustc_typeck/coherence/mod.rs +++ b/src/librustc_typeck/coherence/mod.rs @@ -458,13 +458,25 @@ impl<'a, 'gcx, 'tcx> CoherenceChecker<'a, 'gcx, 'tcx> { being coerced, none found"); return; } else if diff_fields.len() > 1 { - span_err!(tcx.sess, span, E0375, - "the trait `CoerceUnsized` may only be implemented \ - for a coercion between structures with one field \ - being coerced, but {} fields need coercions: {}", - diff_fields.len(), diff_fields.iter().map(|&(i, a, b)| { - format!("{} ({} to {})", fields[i].name, a, b) - }).collect::<Vec<_>>().join(", ")); + let item = tcx.map.expect_item(impl_node_id); + let span = if let ItemImpl(_, _, _, Some(ref t), _, _) = item.node { + t.path.span + } else { + tcx.map.span(impl_node_id) + }; + + let mut err = struct_span_err!(tcx.sess, span, E0375, + "implementing the trait `CoerceUnsized` \ + requires multiple coercions"); + err.note("`CoerceUnsized` may only be implemented for \ + a coercion between structures with one field being coerced"); + err.note(&format!("currently, {} fields need coercions: {}", + diff_fields.len(), + diff_fields.iter().map(|&(i, a, b)| { + format!("{} ({} to {})", fields[i].name, a, b) + }).collect::<Vec<_>>().join(", ") )); + err.span_label(span, &format!("requires multiple coercions")); + err.emit(); return; } diff --git a/src/test/compile-fail/E0375.rs b/src/test/compile-fail/E0375.rs index c6db7b8b64e..29d8e920c4c 100644 --- a/src/test/compile-fail/E0375.rs +++ b/src/test/compile-fail/E0375.rs @@ -8,6 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +// ignore-tidy-linelength + #![feature(coerce_unsized)] use std::ops::CoerceUnsized; @@ -17,6 +19,10 @@ struct Foo<T: ?Sized, U: ?Sized> { c: U, } -impl<T, U> CoerceUnsized<Foo<U, T>> for Foo<T, U> {} //~ ERROR E0375 +impl<T, U> CoerceUnsized<Foo<U, T>> for Foo<T, U> {} +//~^ ERROR E0375 +//~| NOTE requires multiple coercions +//~| NOTE `CoerceUnsized` may only be implemented for a coercion between structures with one field being coerced +//~| NOTE currently, 2 fields need coercions: b (T to U), c (U to T) fn main() {} |
