Make generics always have a valid span
This commit is contained in:
parent
7840a0b753
commit
8e595f5610
5 changed files with 19 additions and 22 deletions
|
@ -628,10 +628,6 @@ impl<'hir> Map<'hir> {
|
|||
})
|
||||
}
|
||||
|
||||
pub fn get_generics_span(&self, id: DefId) -> Option<Span> {
|
||||
self.get_generics(id).map(|generics| generics.span).filter(|sp| *sp != DUMMY_SP)
|
||||
}
|
||||
|
||||
/// Retrieves the `Node` corresponding to `id`, returning `None` if cannot be found.
|
||||
pub fn find(&self, id: NodeId) -> Option<Node<'hir>> {
|
||||
let hir_id = self.node_to_hir_id(id);
|
||||
|
|
|
@ -385,7 +385,7 @@ fn check_region_bounds_on_impl_method<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
|||
// the moment, give a kind of vague error message.
|
||||
if trait_params != impl_params {
|
||||
let def_span = tcx.sess.source_map().def_span(span);
|
||||
let span = tcx.hir().get_generics_span(impl_m.def_id).unwrap_or(def_span);
|
||||
let span = tcx.hir().get_generics(impl_m.def_id).map(|g| g.span).unwrap_or(def_span);
|
||||
let mut err = struct_span_err!(
|
||||
tcx.sess,
|
||||
span,
|
||||
|
@ -396,7 +396,7 @@ fn check_region_bounds_on_impl_method<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
|||
err.span_label(span, "lifetimes do not match method in trait");
|
||||
if let Some(sp) = tcx.hir().span_if_local(trait_m.def_id) {
|
||||
let def_sp = tcx.sess.source_map().def_span(sp);
|
||||
let sp = tcx.hir().get_generics_span(trait_m.def_id).unwrap_or(def_sp);
|
||||
let sp = tcx.hir().get_generics(trait_m.def_id).map(|g| g.span).unwrap_or(def_sp);
|
||||
err.span_label(sp, "lifetimes in impl do not match this method in trait");
|
||||
}
|
||||
err.emit();
|
||||
|
|
|
@ -5050,21 +5050,22 @@ impl<'a> Parser<'a> {
|
|||
/// where typaramseq = ( typaram ) | ( typaram , typaramseq )
|
||||
fn parse_generics(&mut self) -> PResult<'a, ast::Generics> {
|
||||
let span_lo = self.span;
|
||||
if self.eat_lt() {
|
||||
let (params, span) = if self.eat_lt() {
|
||||
let params = self.parse_generic_params()?;
|
||||
self.expect_gt()?;
|
||||
Ok(ast::Generics {
|
||||
params,
|
||||
where_clause: WhereClause {
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
predicates: Vec::new(),
|
||||
span: DUMMY_SP,
|
||||
},
|
||||
span: span_lo.to(self.prev_span),
|
||||
})
|
||||
(params, span_lo.to(self.prev_span))
|
||||
} else {
|
||||
Ok(ast::Generics::default())
|
||||
}
|
||||
(vec![], self.prev_span.between(self.span))
|
||||
};
|
||||
Ok(ast::Generics {
|
||||
params,
|
||||
where_clause: WhereClause {
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
predicates: Vec::new(),
|
||||
span: DUMMY_SP,
|
||||
},
|
||||
span,
|
||||
})
|
||||
}
|
||||
|
||||
/// Parses generic args (within a path segment) with recovery for extra leading angle brackets.
|
||||
|
|
|
@ -36,13 +36,13 @@ LL | fn wrong_bound1<'b,'c,'d:'a+'c>(self, b: Inv<'b>, c: Inv<'c>, d: Inv<'d
|
|||
| ^^
|
||||
|
||||
error[E0195]: lifetime parameters or bounds on method `wrong_bound2` do not match the trait declaration
|
||||
--> $DIR/regions-bound-missing-bound-in-impl.rs:41:5
|
||||
--> $DIR/regions-bound-missing-bound-in-impl.rs:41:20
|
||||
|
|
||||
LL | fn wrong_bound2<'b,'c,'d:'a+'b>(self, b: Inv<'b>, c: Inv<'c>, d: Inv<'d>);
|
||||
| ---------------- lifetimes in impl do not match this method in trait
|
||||
...
|
||||
LL | fn wrong_bound2(self, b: Inv, c: Inv, d: Inv) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ lifetimes do not match method in trait
|
||||
| ^ lifetimes do not match method in trait
|
||||
|
||||
error[E0276]: impl has stricter requirements than trait
|
||||
--> $DIR/regions-bound-missing-bound-in-impl.rs:48:5
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
error[E0049]: method `foo` has 1 type parameter but its trait declaration has 0 type parameters
|
||||
--> $DIR/type-arg-mismatch-due-to-impl-trait.rs:10:5
|
||||
--> $DIR/type-arg-mismatch-due-to-impl-trait.rs:10:11
|
||||
|
|
||||
LL | fn foo(&self, t: Self::T);
|
||||
| -------------------------- expected 0 type parameters
|
||||
...
|
||||
LL | fn foo(&self, t: impl Clone) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ found 1 type parameter
|
||||
| ^ found 1 type parameter
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue