diff options
| -rw-r--r-- | src/librustc_middle/ty/diagnostics.rs | 21 | ||||
| -rw-r--r-- | src/librustc_trait_selection/traits/error_reporting/suggestions.rs | 11 | ||||
| -rw-r--r-- | src/test/ui/bound-suggestions.rs | 2 |
3 files changed, 20 insertions, 14 deletions
diff --git a/src/librustc_middle/ty/diagnostics.rs b/src/librustc_middle/ty/diagnostics.rs index 613d66d59c5..96c36d989e9 100644 --- a/src/librustc_middle/ty/diagnostics.rs +++ b/src/librustc_middle/ty/diagnostics.rs @@ -7,7 +7,6 @@ use rustc_errors::{Applicability, DiagnosticBuilder}; use rustc_hir as hir; use rustc_hir::def_id::DefId; use rustc_hir::{QPath, TyKind, WhereBoundPredicate, WherePredicate}; -use rustc_span::{BytePos, Span}; impl<'tcx> TyS<'tcx> { /// Similar to `TyS::is_primitive`, but also considers inferred numeric values to be primitive. @@ -221,18 +220,16 @@ pub fn suggest_constraining_type_param( } } - let where_clause_span = generics.where_clause.span_for_predicates_or_empty_place(); // Account for `fn foo<T>(t: T) where T: Foo,` so we don't suggest two trailing commas. - let mut trailing_comma = false; - if let Ok(snippet) = tcx.sess.source_map().span_to_snippet(where_clause_span) { - trailing_comma = snippet.ends_with(','); - } - let where_clause_span = if trailing_comma { - let hi = where_clause_span.hi(); - Span::new(hi - BytePos(1), hi, where_clause_span.ctxt()) - } else { - where_clause_span.shrink_to_hi() - }; + let end = generics.where_clause.span_for_predicates_or_empty_place().shrink_to_hi(); + let where_clause_span = generics + .where_clause + .predicates + .last() + .map(|p| p.span()) + .unwrap_or(end) + .shrink_to_hi() + .to(end); match ¶m_spans[..] { &[¶m_span] => suggest_restrict(param_span.shrink_to_hi()), diff --git a/src/librustc_trait_selection/traits/error_reporting/suggestions.rs b/src/librustc_trait_selection/traits/error_reporting/suggestions.rs index 5c85855535e..eb281b270ff 100644 --- a/src/librustc_trait_selection/traits/error_reporting/suggestions.rs +++ b/src/librustc_trait_selection/traits/error_reporting/suggestions.rs @@ -169,8 +169,17 @@ pub trait InferCtxtExt<'tcx> { } fn predicate_constraint(generics: &hir::Generics<'_>, pred: String) -> (Span, String) { + let end = generics.where_clause.span_for_predicates_or_empty_place().shrink_to_hi(); ( - generics.where_clause.span_for_predicates_or_empty_place().shrink_to_hi(), + // Account for `where T: Foo,` so we don't suggest two trailing commas. + generics + .where_clause + .predicates + .last() + .map(|p| p.span()) + .unwrap_or(end) + .shrink_to_hi() + .to(end), format!( "{} {}", if !generics.where_clause.predicates.is_empty() { "," } else { " where" }, diff --git a/src/test/ui/bound-suggestions.rs b/src/test/ui/bound-suggestions.rs index 605a6df8386..562dec9f080 100644 --- a/src/test/ui/bound-suggestions.rs +++ b/src/test/ui/bound-suggestions.rs @@ -19,7 +19,7 @@ fn test_one_bound<T: Sized>(t: T) { } #[allow(dead_code)] -fn test_no_bounds_where<X, Y>(x: X, y: Y) where X: std::fmt::Debug { +fn test_no_bounds_where<X, Y>(x: X, y: Y) where X: std::fmt::Debug, { println!("{:?} {:?}", x, y); //~^ ERROR doesn't implement } |
