mirror of
https://github.com/rust-lang/rust.git
synced 2024-10-31 22:41:50 +00:00
Add a way to get shorter spans until char
for pointing at defs
```rust error[E0072]: recursive type `X` has infinite size --> file.rs:10:1 | 10 | struct X { | ^^^^^^^^ recursive type has infinite size | = help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `X` representable ``` vs ```rust error[E0072]: recursive type `X` has infinite size --> file.rs:10:1 | 10 | struct X { | _^ starting here... 11 | | x: X, 12 | | } | |_^ ...ending here: recursive type has infinite size | = help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `X` representable ```
This commit is contained in:
parent
d616f47cd0
commit
439ff69d90
@ -293,22 +293,20 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
Some(val) => Some(val),
|
||||
None => {
|
||||
span_err!(self.tcx.sess, err_sp, E0272,
|
||||
"the #[rustc_on_unimplemented] \
|
||||
attribute on \
|
||||
trait definition for {} refers to \
|
||||
non-existent type parameter {}",
|
||||
trait_str, s);
|
||||
"the #[rustc_on_unimplemented] attribute on trait \
|
||||
definition for {} refers to non-existent type \
|
||||
parameter {}",
|
||||
trait_str, s);
|
||||
errored = true;
|
||||
None
|
||||
}
|
||||
},
|
||||
_ => {
|
||||
span_err!(self.tcx.sess, err_sp, E0273,
|
||||
"the #[rustc_on_unimplemented] attribute \
|
||||
on trait definition for {} must have \
|
||||
named format arguments, eg \
|
||||
`#[rustc_on_unimplemented = \
|
||||
\"foo {{T}}\"]`", trait_str);
|
||||
"the #[rustc_on_unimplemented] attribute on trait \
|
||||
definition for {} must have named format arguments, eg \
|
||||
`#[rustc_on_unimplemented = \"foo {{T}}\"]`",
|
||||
trait_str);
|
||||
errored = true;
|
||||
None
|
||||
}
|
||||
@ -449,8 +447,8 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
"impl has stricter requirements than trait");
|
||||
|
||||
if let Some(trait_item_span) = self.tcx.hir.span_if_local(trait_item_def_id) {
|
||||
err.span_label(trait_item_span,
|
||||
&format!("definition of `{}` from trait", item_name));
|
||||
let span = self.tcx.sess.codemap().def_span(trait_item_span);
|
||||
err.span_label(span, &format!("definition of `{}` from trait", item_name));
|
||||
}
|
||||
|
||||
err.span_label(
|
||||
@ -652,6 +650,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
{
|
||||
assert!(type_def_id.is_local());
|
||||
let span = self.hir.span_if_local(type_def_id).unwrap();
|
||||
let span = self.sess.codemap().def_span(span);
|
||||
let mut err = struct_span_err!(self.sess, span, E0072,
|
||||
"recursive type `{}` has infinite size",
|
||||
self.item_path_str(type_def_id));
|
||||
@ -669,13 +668,12 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
-> DiagnosticBuilder<'tcx>
|
||||
{
|
||||
let trait_str = self.item_path_str(trait_def_id);
|
||||
let span = self.sess.codemap().def_span(span);
|
||||
let mut err = struct_span_err!(
|
||||
self.sess, span, E0038,
|
||||
"the trait `{}` cannot be made into an object",
|
||||
trait_str);
|
||||
err.span_label(span, &format!(
|
||||
"the trait `{}` cannot be made into an object", trait_str
|
||||
));
|
||||
err.span_label(span, &format!("the trait `{}` cannot be made into an object", trait_str));
|
||||
|
||||
let mut reported_violations = FxHashSet();
|
||||
for violation in violations {
|
||||
|
@ -441,6 +441,25 @@ impl CodeMap {
|
||||
}
|
||||
}
|
||||
|
||||
/// Given a `Span`, try to get a shorter span ending before the first occurrence of `c` `char`
|
||||
pub fn span_until_char(&self, sp: Span, c: char) -> Span {
|
||||
match self.span_to_snippet(sp) {
|
||||
Ok(snippet) => {
|
||||
let snippet = snippet.split(c).nth(0).unwrap_or("").trim_right();
|
||||
if snippet.len() > 0 && !snippet.contains('\n') {
|
||||
Span { hi: BytePos(sp.lo.0 + snippet.len() as u32), ..sp }
|
||||
} else {
|
||||
sp
|
||||
}
|
||||
}
|
||||
_ => sp,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn def_span(&self, sp: Span) -> Span {
|
||||
self.span_until_char(sp, '{')
|
||||
}
|
||||
|
||||
pub fn get_filemap(&self, filename: &str) -> Option<Rc<FileMap>> {
|
||||
for fm in self.files.borrow().iter() {
|
||||
if filename == fm.name {
|
||||
|
@ -2,7 +2,7 @@ error[E0038]: the trait `issue_3907::Foo` cannot be made into an object
|
||||
--> $DIR/issue-3907-2.rs:20:1
|
||||
|
|
||||
20 | fn bar(_x: Foo) {}
|
||||
| ^^^^^^^^^^^^^^^^^^ the trait `issue_3907::Foo` cannot be made into an object
|
||||
| ^^^^^^^^^^^^^^^ the trait `issue_3907::Foo` cannot be made into an object
|
||||
|
|
||||
= note: method `bar` has no receiver
|
||||
|
||||
|
@ -8,8 +8,7 @@
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
struct ListNode { //~ ERROR E0072
|
||||
//~| NOTE recursive type has infinite size
|
||||
struct ListNode {
|
||||
head: u8,
|
||||
tail: Option<ListNode>,
|
||||
}
|
10
src/test/ui/span/E0072.stderr
Normal file
10
src/test/ui/span/E0072.stderr
Normal file
@ -0,0 +1,10 @@
|
||||
error[E0072]: recursive type `ListNode` has infinite size
|
||||
--> $DIR/E0072.rs:11:1
|
||||
|
|
||||
11 | struct ListNode {
|
||||
| ^^^^^^^^^^^^^^^ recursive type has infinite size
|
||||
|
|
||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `ListNode` representable
|
||||
|
||||
error: aborting due to previous error
|
||||
|
20
src/test/ui/span/multiline-span-E0072.rs
Normal file
20
src/test/ui/span/multiline-span-E0072.rs
Normal file
@ -0,0 +1,20 @@
|
||||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// It should just use the entire body instead of pointing at the next two lines
|
||||
struct
|
||||
ListNode
|
||||
{
|
||||
head: u8,
|
||||
tail: Option<ListNode>,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
}
|
16
src/test/ui/span/multiline-span-E0072.stderr
Normal file
16
src/test/ui/span/multiline-span-E0072.stderr
Normal file
@ -0,0 +1,16 @@
|
||||
error[E0072]: recursive type `ListNode` has infinite size
|
||||
--> $DIR/multiline-span-E0072.rs:12:1
|
||||
|
|
||||
12 | struct
|
||||
| _^ starting here...
|
||||
13 | | ListNode
|
||||
14 | | {
|
||||
15 | | head: u8,
|
||||
16 | | tail: Option<ListNode>,
|
||||
17 | | }
|
||||
| |_^ ...ending here: recursive type has infinite size
|
||||
|
|
||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `ListNode` representable
|
||||
|
||||
error: aborting due to previous error
|
||||
|
Loading…
Reference in New Issue
Block a user