]> git.lizzy.rs Git - rust.git/commitdiff
use the correct span when dealing with inference variables
authorBastian Kauschke <bastian_kauschke@hotmail.de>
Wed, 23 Sep 2020 08:44:11 +0000 (10:44 +0200)
committerBastian Kauschke <bastian_kauschke@hotmail.de>
Wed, 23 Sep 2020 08:44:11 +0000 (10:44 +0200)
compiler/rustc_infer/src/infer/error_reporting/need_type_info.rs
src/test/ui/const-generics/infer/cannot-infer-const-args.full.stderr
src/test/ui/const-generics/infer/cannot-infer-const-args.min.stderr
src/test/ui/const-generics/infer/issue-77092.rs [new file with mode: 0644]
src/test/ui/const-generics/infer/issue-77092.stderr [new file with mode: 0644]
src/test/ui/const-generics/infer/method-chain.full.stderr
src/test/ui/const-generics/infer/method-chain.min.stderr
src/test/ui/const-generics/infer/uninferred-consts.full.stderr
src/test/ui/const-generics/infer/uninferred-consts.min.stderr

index bea1ab519f1d606463adc3bd0a29a9db06b708e2..b7debba68b58eb226f7016012519c2a7e1bccc1a 100644 (file)
@@ -275,7 +275,7 @@ pub fn extract_type_name(
                 (s, None, ty.prefix_string(), None, None)
             }
             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 =
                         self.inner.borrow_mut().const_unification_table().probe_value(vid).origin;
                     if let ConstVariableOriginKind::ConstParameterDefinition(name, def_id) =
@@ -308,15 +308,19 @@ pub fn extract_type_name(
                             parent_descr,
                         );
                     }
-                }
+
+                    Some(origin.span).filter(|s| !s.is_dummy())
+                } else {
+                    bug!("unexpect const: {:?}", ct);
+                };
 
                 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 {
                     printer.region_highlight_mode = highlight;
                 }
                 let _ = ct.print(printer);
-                (s, None, "value".into(), None, None)
+                (s, span, "the constant".into(), None, None)
             }
             GenericArgKind::Lifetime(_) => bug!("unexpected lifetime"),
         }
@@ -705,7 +709,7 @@ fn missing_type_msg(
                 "".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`"
             format!(
                 "cannot infer {} {} {} `{}`{}",
index a5f7705804e026b4f22763010d513b46c8b02d21..b438ed3ad6508cb2100bc1ea060ba5f56368b264 100644 (file)
@@ -2,7 +2,7 @@ error[E0282]: type annotations needed
   --> $DIR/cannot-infer-const-args.rs:12:5
    |
 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
 
index a5f7705804e026b4f22763010d513b46c8b02d21..b438ed3ad6508cb2100bc1ea060ba5f56368b264 100644 (file)
@@ -2,7 +2,7 @@ error[E0282]: type annotations needed
   --> $DIR/cannot-infer-const-args.rs:12:5
    |
 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
 
diff --git a/src/test/ui/const-generics/infer/issue-77092.rs b/src/test/ui/const-generics/infer/issue-77092.rs
new file mode 100644 (file)
index 0000000..9a1dd1a
--- /dev/null
@@ -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
+    }
+}
diff --git a/src/test/ui/const-generics/infer/issue-77092.stderr b/src/test/ui/const-generics/infer/issue-77092.stderr
new file mode 100644 (file)
index 0000000..e84ff8b
--- /dev/null
@@ -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`.
index 0344b364166d7ba2cc26b1597777e47a5e0d6944..1fb0b23cf11574d7e997fea6e607e4ac12c00a83 100644 (file)
@@ -2,7 +2,7 @@ error[E0282]: type annotations needed
   --> $DIR/method-chain.rs:21:33
    |
 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
 
index 0344b364166d7ba2cc26b1597777e47a5e0d6944..1fb0b23cf11574d7e997fea6e607e4ac12c00a83 100644 (file)
@@ -2,7 +2,7 @@ error[E0282]: type annotations needed
   --> $DIR/method-chain.rs:21:33
    |
 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
 
index 47ffc7e7157cc0708b49376b079a7804b5c36ae3..7a451903e9630581760706173e315db758c6dfce 100644 (file)
@@ -2,7 +2,7 @@ error[E0282]: type annotations needed
   --> $DIR/uninferred-consts.rs:14:9
    |
 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
 
index 47ffc7e7157cc0708b49376b079a7804b5c36ae3..7a451903e9630581760706173e315db758c6dfce 100644 (file)
@@ -2,7 +2,7 @@ error[E0282]: type annotations needed
   --> $DIR/uninferred-consts.rs:14:9
    |
 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