use the correct span when dealing with inference variables
This commit is contained in:
parent
0abb1abf04
commit
3dbfdb0182
9 changed files with 40 additions and 11 deletions
|
@ -275,7 +275,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||||
(s, None, ty.prefix_string(), None, None)
|
(s, None, ty.prefix_string(), None, None)
|
||||||
}
|
}
|
||||||
GenericArgKind::Const(ct) => {
|
GenericArgKind::Const(ct) => {
|
||||||
if let ty::ConstKind::Infer(InferConst::Var(vid)) = ct.val {
|
let span = if let ty::ConstKind::Infer(InferConst::Var(vid)) = ct.val {
|
||||||
let origin =
|
let origin =
|
||||||
self.inner.borrow_mut().const_unification_table().probe_value(vid).origin;
|
self.inner.borrow_mut().const_unification_table().probe_value(vid).origin;
|
||||||
if let ConstVariableOriginKind::ConstParameterDefinition(name, def_id) =
|
if let ConstVariableOriginKind::ConstParameterDefinition(name, def_id) =
|
||||||
|
@ -308,15 +308,19 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||||
parent_descr,
|
parent_descr,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
Some(origin.span).filter(|s| !s.is_dummy())
|
||||||
|
} else {
|
||||||
|
bug!("unexpect const: {:?}", ct);
|
||||||
|
};
|
||||||
|
|
||||||
let mut s = String::new();
|
let mut s = String::new();
|
||||||
let mut printer = ty::print::FmtPrinter::new(self.tcx, &mut s, Namespace::TypeNS);
|
let mut printer = ty::print::FmtPrinter::new(self.tcx, &mut s, Namespace::ValueNS);
|
||||||
if let Some(highlight) = highlight {
|
if let Some(highlight) = highlight {
|
||||||
printer.region_highlight_mode = highlight;
|
printer.region_highlight_mode = highlight;
|
||||||
}
|
}
|
||||||
let _ = ct.print(printer);
|
let _ = ct.print(printer);
|
||||||
(s, None, "value".into(), None, None)
|
(s, span, "the constant".into(), None, None)
|
||||||
}
|
}
|
||||||
GenericArgKind::Lifetime(_) => bug!("unexpected lifetime"),
|
GenericArgKind::Lifetime(_) => bug!("unexpected lifetime"),
|
||||||
}
|
}
|
||||||
|
@ -705,7 +709,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||||
"".to_string()
|
"".to_string()
|
||||||
};
|
};
|
||||||
|
|
||||||
let preposition = if "value" == kind_str { "of" } else { "for" };
|
let preposition = if "the value" == kind_str { "of" } else { "for" };
|
||||||
// For example: "cannot infer type for type parameter `T`"
|
// For example: "cannot infer type for type parameter `T`"
|
||||||
format!(
|
format!(
|
||||||
"cannot infer {} {} {} `{}`{}",
|
"cannot infer {} {} {} `{}`{}",
|
||||||
|
|
|
@ -2,7 +2,7 @@ error[E0282]: type annotations needed
|
||||||
--> $DIR/cannot-infer-const-args.rs:12:5
|
--> $DIR/cannot-infer-const-args.rs:12:5
|
||||||
|
|
|
|
||||||
LL | foo();
|
LL | foo();
|
||||||
| ^^^ cannot infer the value for const parameter `X` declared on the function `foo`
|
| ^^^ cannot infer the value of const parameter `X` declared on the function `foo`
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ error[E0282]: type annotations needed
|
||||||
--> $DIR/cannot-infer-const-args.rs:12:5
|
--> $DIR/cannot-infer-const-args.rs:12:5
|
||||||
|
|
|
|
||||||
LL | foo();
|
LL | foo();
|
||||||
| ^^^ cannot infer the value for const parameter `X` declared on the function `foo`
|
| ^^^ cannot infer the value of const parameter `X` declared on the function `foo`
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
16
src/test/ui/const-generics/infer/issue-77092.rs
Normal file
16
src/test/ui/const-generics/infer/issue-77092.rs
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
#![feature(min_const_generics)]
|
||||||
|
|
||||||
|
use std::convert::TryInto;
|
||||||
|
|
||||||
|
fn take_array_from_mut<T, const N: usize>(data: &mut [T], start: usize) -> &mut [T; N] {
|
||||||
|
(&mut data[start .. start + N]).try_into().unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut arr = [0, 1, 2, 3, 4, 5, 6, 7, 8];
|
||||||
|
|
||||||
|
for i in 1 .. 4 {
|
||||||
|
println!("{:?}", take_array_from_mut(&mut arr, i));
|
||||||
|
//~^ ERROR type annotations needed
|
||||||
|
}
|
||||||
|
}
|
9
src/test/ui/const-generics/infer/issue-77092.stderr
Normal file
9
src/test/ui/const-generics/infer/issue-77092.stderr
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
error[E0282]: type annotations needed
|
||||||
|
--> $DIR/issue-77092.rs:13:26
|
||||||
|
|
|
||||||
|
LL | println!("{:?}", take_array_from_mut(&mut arr, i));
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^ cannot infer the value of the constant `{_: usize}`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0282`.
|
|
@ -2,7 +2,7 @@ error[E0282]: type annotations needed
|
||||||
--> $DIR/method-chain.rs:21:33
|
--> $DIR/method-chain.rs:21:33
|
||||||
|
|
|
|
||||||
LL | Foo.bar().bar().bar().bar().baz();
|
LL | Foo.bar().bar().bar().bar().baz();
|
||||||
| ^^^ cannot infer the value for const parameter `N` declared on the associated function `baz`
|
| ^^^ cannot infer the value of const parameter `N` declared on the associated function `baz`
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ error[E0282]: type annotations needed
|
||||||
--> $DIR/method-chain.rs:21:33
|
--> $DIR/method-chain.rs:21:33
|
||||||
|
|
|
|
||||||
LL | Foo.bar().bar().bar().bar().baz();
|
LL | Foo.bar().bar().bar().bar().baz();
|
||||||
| ^^^ cannot infer the value for const parameter `N` declared on the associated function `baz`
|
| ^^^ cannot infer the value of const parameter `N` declared on the associated function `baz`
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ error[E0282]: type annotations needed
|
||||||
--> $DIR/uninferred-consts.rs:14:9
|
--> $DIR/uninferred-consts.rs:14:9
|
||||||
|
|
|
|
||||||
LL | Foo.foo();
|
LL | Foo.foo();
|
||||||
| ^^^ cannot infer the value for const parameter `N` declared on the associated function `foo`
|
| ^^^ cannot infer the value of const parameter `N` declared on the associated function `foo`
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ error[E0282]: type annotations needed
|
||||||
--> $DIR/uninferred-consts.rs:14:9
|
--> $DIR/uninferred-consts.rs:14:9
|
||||||
|
|
|
|
||||||
LL | Foo.foo();
|
LL | Foo.foo();
|
||||||
| ^^^ cannot infer the value for const parameter `N` declared on the associated function `foo`
|
| ^^^ cannot infer the value of const parameter `N` declared on the associated function `foo`
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue